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

时间:2014-03-21 15:34:26

标签: bash file awk

我的同事给了我一个文件,其中一半的行由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中是否可以更方便地做到这一点?

谢谢你们!

4 个答案:

答案 0 :(得分:4)

您可以使用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

请注意,不保留空格。

在大多数名为paste的类Unix系统上还有另一种工具可用:

$ 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的第一行中的尾随空格导致分隔制表符为偏移到下一列。您可以阅读粘贴的手册页以获取控制此选项的选项。

答案 1 :(得分:2)

您可以sed

sed 'N;s/\n/ /' file

awk

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

答案 2 :(得分:2)

尝试:

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

答案 3 :(得分:2)

另一个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将存储实际的分隔符。