AWK 合并行

AWK 合并行

我有如下输入文件

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
}

相关内容