我有如下输入文件
1
2
3
4
5
6
7
8
9
10
我需要如下输出
1 2
3 4 5
6 7
8 9 10
意味着前两行要连接在一起,然后接下来的三行也连接在一起。
答案1
我还可以用以下方法完成这项工作paste
:
$ seq 10 | paste -s -d $' \n \n'
1 2
3 4 5
6 7
8 9 10
$
我在这里使用了 bash (for $'\n'
)。并seq 10
重现您的输入:
$ seq 10
1
2
3
4
5
6
7
8
9
10
$
答案2
双 awk 方法:
$ awk '{printf("%s",$0 (NR%5==0?ORS:":"))}' file1 |awk -F':' '{print $1,$2;print $3,$4,$5}'
1 2
3 4 5
6 7
8 9 10
线首先以五组为一组连接,每条线用:
符号连接。
即使行包含更多单词,解决方案也能工作
$ cat file2
this is line 1
this is line 2
this is line 3
this is line 4
this is line 5
this is line 6
this is line 7
this is line 8
this is line 9
this is line 10
$ awk '{printf("%s",$0 (NR%5==0?ORS:":"))}' file2 |awk -F':' '{print $1,$2;print $3,$4,$5}'
this is line 1 this is line 2
this is line 3 this is line 4 this is line 5
this is line 6 this is line 7
this is line 8 this is line 9 this is line 10
答案3
只需执行以下操作即可awk
:
awk -v step=3 '{l=(!l)?l$0:l" "$0} ++seen==2 && step==3{print l;step++;l=seen=""}
seen==3{print l;step--;l=seen=""}' infile
输出:
1 2
3 4 5
6 7
8 9 10
答案4
#!/usr/bin/awk -f
BEGIN { maxlines=2 ; lc=0 }
{ outputline=outputline " " $0; lc++ }
lc % maxlines == 0 {
sub(/^ /,"",outputline); # strip unwanted leading space
print outputline;
outputline="";
lc=0;
maxlines = 5 - maxlines; # flip-flop: 5-2=3, 5-3=2
}
这会在连接和打印 2 或 3 个连续行之间交替。
输出:
1 2
3 4 5
6 7
8 9 10
或使用原始输入数据:
Unix Linux
Solaris AIX Sco
或者,使用数组。 awk
没有join()
函数,所以我们必须提供一个。
#!/usr/bin/awk -f
BEGIN { maxlines=2 ; lc=0 }
function join(sep,array, i) {
result=array[1];
for (i=2;i<=length(array);i++) result = result sep array[i];
return result
};
{ lines[++lc]=$0 }
lc % maxlines == 0 {
print join(" ", lines);
delete lines;
lc=0;
maxlines = 5-maxlines
}