如何递归地将n行放入一行

时间:2015-11-26 07:52:36

标签: unix awk sed text-processing tr

有人可以帮我把文件的n行放到一行。

以下是我试图实现的例子:

$ cat samplefile.txt
aaa AAA  XX
bbb BBB  AA
ccc CCC AA
ddd DDD 12
eee EEE 3
fff FFF
ggg GGG 3 
hhh HHH4 55
iii III 33
jjj JJJ

$ cat desiredfile
aaa AAA XX bbb BBB AA ccc CCC AA ddd DDD 12 eee  EEE 3
fff FFF ggg GGG 3 hhh HHH4 55 iii III 33 jjj JJJ

这里n = 5,我需要每隔5行作为分隔符。不知道如何实现这个目标。请指教。

4 个答案:

答案 0 :(得分:1)

awk -vl=5 'ORS=++c%l?" ":"\n"' file
aaa AAA  XX bbb BBB  AA ccc CCC AA ddd DDD 12 eee EEE 3
fff FFF ggg GGG 3  hhh HHH4 55 iii III 33 jjj JJJ

阐释:

++ c自动计数

++ c%l == 0< => 5%5 == 0 ===> ORS = “\ n” 个

答案 1 :(得分:0)

在打印换行符时,除了每五行之外,在行之间打印空格:

$ awk '{printf "%s%s",$0,(NR%5?OFS:ORS)} END{print""}' samplefile.txt 
aaa AAA  XX bbb BBB  AA ccc CCC AA ddd DDD 12 eee EEE 3
fff FFF ggg GGG 3  hhh HHH4 55 iii III 33 jjj JJJ

如何运作

awk隐式循环遍历文件中的所有行

  • printf "%s%s",$0,(NR%5?OFS:ORS)

    这是两个字符串的格式化打印。第一个字符串是$0,这是我们刚读过的字符串。第二个字符串是三元语句的结果:

    `NR%5?OFS:ORS`
    

    NR是到目前为止读取的行数。 NR%5是到目前为止以5为模数读取的行数。如果NR%5非零,则此语句返回输出字段分隔符OFS。默认情况下,OFS是一个空格。如果为零,则语句返回输出记录分隔符ORS。默认情况下,ORS是换行符。因此,每五行,这个三元语句返回一个换行符。在其他行上,它返回一个空格。

  • END{print""}

    到达文件末尾后,会打印换行符。这可以确保我们在输出结尾处至少有一个换行符。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed ':a;N;s/[^\n]*/&/5;Ta;y/\n/ /' file

继续在模式空间中附加行,直到模式匹配所需的匹配数(在本例中为5),然后用空格替换每个换行符。

使用粘贴的替代方法是:

paste -sd'    \n' file

选项分隔符(-d)包含四个空格和换行符(\n)。

或者使其成为程序化的:

paste -sd"$(printf '%*s\\n' 4)" file

想象第一行从零开始。

答案 3 :(得分:0)

您可以使用xargs并告诉它一次读取5行。它的默认操作是回显它的参数,这就是你想要的:

xargs -L5 < samplefile.txt

aaa AAA XX bbb BBB AA ccc CCC AA ddd DDD 12 eee EEE 3
fff FFF ggg GGG 3 hhh HHH4 55 iii III 33 jjj JJJ