sed - 带 sed 的 while 循环。用另一个文件中的文本替换一个文件中的匹配模式
问题描述
我想将文本文件(file1)中的字符串添加到第二个文本文件(file2)。file1 中的字符串应在每个大于符号之后按顺序添加到 file2 >
。file2 中有 9 个大于符号,file1 中有 9 个字符串。File1 在第 1 列的第 1-9 行包含 9 个不同的字符串。像这样:
...
sctC_
sctJ_
sctV_
...
这是带有 sed 的 while 循环,我试图将字符串添加到 file2 中:
while IFS=$'\t' read f1 f2 ; do sed "s/^>/&$f2/" ; done < <(paste file2 file1)
但是,只有第一个字符串被添加到 file2 中,并且第一行从 file2 中删除:
MRNVLYAFLLTLYRGFCWSTVLLGMLPMAHAVTPPEWNKGAYAYSAEQTLLSTILIDFANSHGVELVMDN sctJ_
LKDTLVEAKIRAETPAAFLDRLALEHRFQWFVYNHTLYVSSQDTQASIRLEISPDAAPDLKQALSGIGLL sctV_
DPRFGWGELPEEGVVLVTGPQTYIDLIRNFSQQREKQDERRKVMIFPLRFASVSDRTLQYRDQRIVIPGV sctN_
ATILSELMDGQRPPPTGASGPTDAVPDSAMEAMRENTRAMLTRLATRNNPARSTDENGRLVLNGRISADV sctQ_
RNNALLVRDDEKRREEYQQLVEQIDVPQNLVNIDAIILDVDRTALSRLEANWQGTLGNVSAGSTMMMGRS sctR_
TLFVSDFKRFFADIQALEGEGTASIVANPSVLTLENQPAIVDFSRTAFITATGERVAQIQPITAGTSLQV sctS_
TPRVVGQDGPRSIQLVIDIEDGRVETGRDGEATGVKRGTVSTQALIGENRALVLGGFHVEESGDRDHRIP sctT_
LLGDIPWLGRLFTSTRHEVSRRERLFILTPHLIGDQTDPTRYVSAENRHQINDVMNRVSQRNGKHDLYSL sctU_
VENALRDLAGKQLPAGFQSETRGTRLSEVCRSQPGLVYDSNRYQWYGNGSIRLTVGVVRNSGTRIQRFDE
SVCGSNRTLAVAAWPKTTLAPGESTEVFLALQTLSSTAPPRRSLLASY
>sctC_12a_02741 hypothetical protein
MKTDLRALFLLLSLLLMGCGDPIELNRGLSENDANEVIAALGRYQIAAEKRVDKTGVTLIIDAKNMERAV
NILNAAGLPRQSRTNLGEVFQKSGVISTPLEERARYIYALSQEVEATLTQIDGVLVARVHVVLPERIAPG
EPVQPASAAVFIKYQPELEPDSVEPRIRRMVASSIPGLSGKNDKDLSIVFVPAEPYQDTIPVVTLGPFTL
TPQEMVRWQWTAGLMGALIIGLLAWRLGKPYMRQWQQNRADARQQR
>sctC_12a_02750 Invasion protein InvA
MNLVIIWLNRIALSAMQRSEVVGAVIVMSIVFMMIIPLPTSLIDVLIAFNICVSSLLIVLAMYLPKPLAF
STFPAVLLLTTMFRLALSISTTRQILLQQDGGHIVEAFGNYVVGGNLAVGLVIFLILTVVNFLVITKGSE
RVAEVAARFTLDAMPGKQMSIDSDLRAGLIEAHQARQRRDNLAKESQLFGAMDGAMKFVKGDAIAGLVIV
FINMIGGFAIGVLQHGMSAADAMHVYSVLTIGDGLIAQIPALLISLTAGMIITRVSAEGQPLDANIGREI
AEQLTSQPKAWIISALGMFGFALLPGMPSMVFMVISLASFSSGVFQLWRIKQQGILTHSQAEADNQPAEQ
NGHQDLRRFNPTRAYLLQFHPSMQGNPATLSLVQHIRRLRNRLVYQFGMTLPSFDIEFSDRLDEDEFQFG
VYEIPYVKATFVTERLAVHRSSFDQGELEDAIAGSTLRDEADWLWVSPMHPLLEQETCPRWAAGELILMR
MENAIHRSGAQFIGLQETKSILTWLESEQPELAQELQRIMPLSRFAGVLQRLASERIPLRSVRPIAEALI
EIGQHERDVHALTDYVRLALKAQICHQYSQQNTLHVWLLTPETEELLRDSLRQTQNETFFALTQDYAATL
LGQLRRAFPPSLPSTGQILVAQDLRTPLRVLLQEEFHHVPVLSFSELESHLSINVLGRFDLYEENTPFSA
>sctC_12a_02752 Type III secretion ATP synthase HrcN
MQTQAAIDFPLMTRWFQQQRRRLSDFAPVDLKGRIIGISGILLECSLPRARIGDLCLVERQDGSQVMAEV
VGFSPRNTFLSALGALDGIAQGAAVAPLYQPHCIQVSDRLFGSVLDGFGRALEDGGESAFVQPGELHGNA
QPVLGDAPPPTARPRIATPLPTGLRAIDGLLTLGQGQRVGIFAGAGCGKTTLLAELARNTPCDAIVFGLI
GERGRELREFLDHELDDDLRRRTVLVCSTSDRSSMERARAAFTATAIAEAYRAAGKQVLLIIDSLTRFAR
AQREIGLALGEPQGRGGLPPSVYTLLPRLVERAGQTQTGAITALYSVLIEQDSMNDPVADEVRSLIDGHI
VLTRRLAEQGHYPAIDVLASLSRTMSNVVDDGHNRHAGAVRRLMAAYKQVEMLIRLGEYQSGHDALTDSA
VNAQQDITRFLRQAMRDPMAYDDIQQQLAEVSAHAP
如何在file2上的大于符号之后递归添加file1中的字符串?
谢谢,
京东
解决方案
我不确定我是否完全理解您的要求,但 Perl 应该很容易处理这个问题。将第一个文件读入数组,然后遍历第二个文件并使用数组添加缺失的信息。
perl -we 'push @s, scalar <> until eof;
chomp @s;
s/(?<=^>)/shift @s/e, print while <>;
' file1 file2
<>
是readline的较短版本,它在标量上下文中从文件中读取一行。- 当文件用完时,eof返回 true。
- chomp从数组中删除尾随的换行符。
(?<=...)
是一个lookbehind,在这种情况下,它在行首的后面匹配>
- 替换运算符的
/e
修饰符将替换s///
计算为代码,shift从数组中提取第一个元素@s
推荐阅读
- azure - Azure 存储资源管理器配置存储在哪里?
- slack - 我们如何修改slack bot的about
- c++ - 如何获取 Visual C++ 命令行项目的 DLL 缺失错误反馈?
- python - Python - 解析 Excel 文件 / xlrd 和 openpyxl 之间的差异(日期系统和单元格值类型)
- java - 调用 JAXB getter 导致输出 xs:list 类型的空属性值
- node.js - 如何从节点服务器获取 zip 文件到 react-native 客户端
- dockerfile - 如何为 bazel container_image 规则指定等效的 Dockerfile RUN?
- amazon-web-services - DynamoDB 返回以下未授权执行
- php - WooCommerce 产品的自定义添加到购物车短代码不适用于外部产品
- java - 为 Keycloak httpClient 设置自定义 SNI 服务器名称