아래와 같은 입력 파일이 있습니다.
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
}