我的同事给了我一个文件,其中一半的行是由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