有人可以帮我把文件的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行作为分隔符。不知道如何实现这个目标。请指教。
答案 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