【问题标题】:Issue with unix: merging two lines with sedunix 的问题:用 sed 合并两行
【发布时间】:2020-09-22 23:03:07
【问题描述】:

我有一个无法解决的奇怪问题。我正在使用以下 bash 脚本在 unix 上将两行合并在一起。但是,第一行的最后一列与第二行的第一列合并(没有空格)。有人可以帮忙吗?

sed 'N;s/\n/  /' input.txt >> output.txt

输入:

chr6    108930289   108930461   GWNJ-0842:521:GW1906282259th:8:1101:11373:39475:GCCAAGsize=1
HPV45   5328    5400    GWNJ-0842:521:GW1906282259th:8:1101:11373:39475:GCCAAGsize=1
chr3    153084969   153085002   GWNJ-0842:521:GW1906282259th:8:1101:14560:33322:GCCAATsize=6
HPV45   4014    4219    GWNJ-0842:521:GW1906282259th:8:1101:14560:33322:GCCAATsize=6

输出:(例如 HPV45 附加到它之前的 1)

chr6    108930289   108930461   GWNJ-0842:521:GW1906282259th:8:1101:11373:39475:GCCAAGsize=1HPV45   5328    5400    GWNJ-0842:521:GW1906282259th:8:1101:11373:39475:GCCAAGsize=1
chr3    153084969   153085002   GWNJ-0842:521:GW1906282259th:8:1101:14560:33322:GCCAATsize=6HPV45   4014    4219    GWNJ-0842:521:GW1906282259th:8:1101:14560:33322:GCCAATsize=6

【问题讨论】:

  • 嗨 mevets,感谢您的评论。它不允许我附加 txt 文件。我从输入和输出中粘贴了几行。这有帮助吗?
  • 你试过sed 'N;s/\r\n/ /' file吗?
  • 您好 Oguz,感谢您的回复。我尝试了这个以及我在网上找到的几个不同的选项。发生的情况是第二行保留在第二行中,在它之前只添加了一个空格。我能够真正合并这两行的唯一方法是我使用的代码,它最终将文本合并在一起。如果你还能想到什么,请告诉我,我会试试的。
  • od -c ./input 在size=1 和HPV45 之间显示什么?例如,当我使用您的示例输入运行它时,我看到 s i z e = 1 \n H P V
  • 嗨,Seige,谢谢。是的,它也向我展示了输入文件的相同内容。然而,在输出文件中,它显示 s i z e = 1 H P V

标签: unix sed merge


【解决方案1】:

您可以使用awk 作为替代。

此脚本保存每个奇数输入行(从 1 开始),并为每个偶数行打印保存的行(不带行分隔符)和当前行:

awk 'NR%2 {save=$0;}
!(NR%2) {print save,$0;}' input.txt >> output.txt

下一个脚本依赖于行首的模式chr 或HPV,而不是使用行号:

awk '/^chr/ {save=$0;} 
/^HPV/ {print save,$0;}' input.txt >> output.txt

根据问题的输入,两个脚本都会产生以下输出:

chr6    108930289   108930461   GWNJ-0842:521:GW1906282259th:8:1101:11373:39475:GCCAAGsize=1 HPV45   5328    5400    GWNJ-0842:521:GW1906282259th:8:1101:11373:39475:GCCAAGsize=1
chr3    153084969   153085002   GWNJ-0842:521:GW1906282259th:8:1101:14560:33322:GCCAATsize=6 HPV45   4014    4219    GWNJ-0842:521:GW1906282259th:8:1101:14560:33322:GCCAATsize=6

注意事项:
如果总行数为奇数,基于行号的脚本将忽略最后一行。
如果输入并不总是包含成对的匹配行,则基于模式的脚本将产生错误的结果。

【讨论】:

  • 谢谢!当我在仅复制我上面发送的两行的输出文件上运行它时,它对我不起作用。如果它改变任何东西,我正在使用 Mac 上的终端来执行此操作。
  • 在 mac 上使用分隔符会不会有问题?问题是其他的 awk 代码对我也不起作用。
  • @neginValizadegan “对我不起作用”到底是什么意思?由于 cmets 不是为此而设计的,请编辑您的问题、显示输入、您使用的确切命令和结果输出。正如其他人已经写的那样,您可能会遇到由错误或不一致的行尾引起的问题。请同时显示od -c input.txt 和od -c output.txt 的结果。如果您的文件超过几行,请使用 head -4 input.txt | od -c
  • 这个最终为我工作。不是为什么一开始没有。谢谢!:awk 'NR%2 {save=$0;} !(NR%2) {print save,$0;}' input.txt >> output.txt
猜你喜欢
  • 2015-07-11
  • 2013-07-07
  • 2014-10-05
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多