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를 사용하고 있습니다 $'\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

선은 먼저 5개의 그룹으로 연결되며 각 선은 :기호로 연결됩니다.

줄에 더 많은 단어가 포함되어 있어도 솔루션이 작동합니다.

$ 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
}

관련 정보