在Bash中连接行

9

大多数命令行程序一次只操作一行。

我能否使用常见的命令行工具(如echo、sed、awk等)将每组两行连接起来,还是需要从头编写脚本/程序来完成这个操作?

$ cat myFile
line 1
line 2
line 3
line 4

$ cat myFile | __somecommand__
line 1line 2
line 3line 4
5个回答

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

获取下一行,并将换行符替换为空格。

seq 1 6 | sed 'N;s/\n/ /;'
1 2
3 4
5 6

printf "%s\n" {1..6} | sed 'N;s/\n/ /;' 打印输出 1 到 6 数字序列,然后通过 sed 命令将每行的换行符替换成空格。 - ghostdog74

8
$ awk 'ORS=(NR%2)?" ":"\n"' file
line 1 line 2
line 3 line 4

$ paste - -  < file
line 1  line 2
line 3  line 4

3
+1 表示粘贴成功。请注意, 默认的分隔符是制表符,如果您真的想让行紧密地粘在一起,请使用 -d "" - glenn jackman

1
不是一个特定的命令,但是这段shell代码应该能解决问题:
cat myFile | while read line; do echo -n $line; [ "${i}" ] && echo && i= || i=1 ; done

1
UUOC。while read line; do echo -n $line; [ "${i}" ] && echo && i= || i=1 ; done < File - ghostdog74
哈,直到你发帖之前我才了解到UUOC。对于简单的情况,我仍然认为使用cat命令更清晰,即使它稍微慢一些并且浪费一个进程。:-) - kanaka
希望像英语母语者一样先有主题(输入)。 - kanaka

1
你也可以将Perl用作:
$ perl -pe 'chomp;$i++;unless($i%2){$_.="\n"};' < file
line 1line 2
line 3line 4

perl -ne 'chomp($p=$_); $q=<>; print $p,$q' file - glenn jackman
@glenn:很棒,谢谢。 - codaddict

1
这是一个不需要切换标志的shell脚本版本:
while read line1; do read line2; echo $line1$line2; done < inputfile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接