sed를 사용하여 n줄 연결

sed를 사용하여 n줄 연결

최근에 나는 한 사람에게 물었다.질문행 쌍을 정렬하는 방법 중 하나는 다음 sed과 같이 행을 연결하는 것을 제안합니다.

cat file.txt | sed -n 'N;s/\n//;p' | sort -t";" -k43,43n | perl -F';' -ane '$,=";";print @F[0..13],"\n";print @F[14..$#F]'

이것은 훌륭하게 작동하지만 이제 내 문제는 n-튜플 행 정렬로 일반화되며 sed를 사용하여 이 작업을 수행하는 방법을 모르겠습니다.

내가 찾은 모든 것은 2행이거나 모든 행이지만 n행이 필요합니다(여기서 n은 현재 5이지만 일반적인 접근 방식은 괜찮습니다).

n 행을 수용하기 위해 해당 섹션을 다시 작성하는 좋은 방법에 대한 보너스 포인트이지만 perl실제로 문제는 해당 sed섹션에 관한 것입니다.

저는 sed이것에 특별히 초점을 맞추고 있지 않습니다. 따라서 다른 명령줄 도구를 사용하여 좋은 해결책이 있으면 게시해 주세요.

업데이트: 입력 예(n == 3)

a1;b1;c1; 
n1;m1;l1; 
d1;e1;f1;g1
n2;m2;l2;
a2;b2;c2;
d2;e2;f2;g2

답변1

sed -e:n -e$\bo -e'N;s/\n/&/4;to' -ebn -e:o -e'y/\n/ /' <in >out

이렇게 하면 5줄(또는 1 + 4줄)이 연결되어 각 개행 문자가 공백으로 대체됩니다. 하지만:

paste -d\  - - - - - <in >out

...그것도 작동합니다.

귀하 g의 작업은 다음과 같이 작동할 수 있습니다.

paste -d\  - - <input   |
sed 's/.*;\(.*\)/\1;&/' |
sort -t\; -k1,1         |
cut  -d\; -f2-          |
tr \  \\n

...이것은 입력 파일에 공백을 사용하지 않지만 상당히 일반적인 접근 방식입니다. 공백의 두 행마다 결합하고, ;마지막 분할 필드를 각 행의 헤드에 복사하고, 첫 번째 필드를 정렬한 다음, 잘라내고 행을 다시 분할합니다.

답변2

약간만 수정하면 이 솔루션을 사용할 수 있습니다.나는 출판했다다른 질문에 관해서.

GNU sed 및 GNU awk를 다시 사용하고 마지막 요소를 정렬 키로 사용하여 데이터의 동종 구조를 가정합니다.

# Separate input into records, here 3 lines each
sed '3~3G' infile |

# Use GNU awk's built-in sort, here index-string-descending
awk '
  BEGIN { PROCINFO["sorted_in"] = "@ind_str_desc" }
  { h[$NF] = $0 }
  END { for(k in h) print h[k] }
' RS= FS='[;\n]+'   

산출:

n2;m2;l2;
a2;b2;c2;
d2;e2;f2;g2
a1;b1;c1; 
n1;m1;l1; 
d1;e1;f1;g1

관련 정보