我的同事给了我一个文件,其中一半的行由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中是否可以更方便地做到这一点?
谢谢你们!
答案 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
将存储实际的分隔符。