将文件中的每两行粘贴为一行BASH



我的同事给了我一个文件,其中一半的行是由8列信息组成的,另一半是由9列信息组成的。它们总是紧挨着的,例如

1 2 3 4 5 6 7 8
1.1
2 3 4 5 6 7 8 9
1.2
...
a b c d e f g h
abcd

我知道如何将每两行粘贴为一行,然后在Python中打印出来。但我想知道是否有可能在BASH中更方便地做到这一点?

谢谢你们了!

您可以使用sed或awk,正如其他答案所提到的那样。这些答案都很好。

您也可以在纯shell中轻松完成此操作。

$ while read line1; do read line2; echo "$line1 $line2"; done < input.txt
1 2 3 4 5 6 7 8 1.1
2 3 4 5 6 7 8 9 1.2

注意空格不保留

在大多数类unix系统上有另一个工具叫做paste:

$ paste - - < input.txt
1 2 3 4 5 6 7 8         1.1
2 3 4 5 6 7 8 9 1.2

在这种情况下,第一行有一个很大的空格,因为paste在默认情况下使用制表符分隔列,并且input.txt第一行的尾随空格导致分隔制表符偏移到下一列。

另一个awk

awk '{f=$0;getline;print f,$0}' file
1 2 3 4 5 6 7 8 1.1
2 3 4 5 6 7 8 9 1.2

为了好玩,一个gnu awk

awk -v RS="[0-9][.][0-9]" '{$1=$1;print $0,RT}' file
1 2 3 4 5 6 7 8 1.1
2 3 4 5 6 7 8 9 1.2

将记录分隔符设置为第二行中的值。
然后RT将存储实际的分隔符。

try:

awk '{printf "%s%s",$0,(NR%2?FS:RS)}' file

或:

awk 'NR%2{printf "%s ",$0;next}7' file
测试:

kent$  echo "1 2 3 4 5 6 7 8 
1.1
2 3 4 5 6 7 8 9
1.2"|awk '{printf "%s%s",$0,(NR%2?FS:RS)}'
1 2 3 4 5 6 7 8  1.1
2 3 4 5 6 7 8 9 1.2
kent$  echo "1 2 3 4 5 6 7 8 
1.1
2 3 4 5 6 7 8 9
1.2"|awk 'NR%2{printf "%s ",$0;next}7'     
1 2 3 4 5 6 7 8  1.1
2 3 4 5 6 7 8 9 1.2

您可以sed:

sed 'N;s/n/ /' file

awk:

awk 'NF==1{print $0}{printf "%s ",$0}' file

相关内容

  • 没有找到相关文章

最新更新