패턴 일치 후 현재 행의 다음 n번째 열을 인쇄하는 방법은 무엇입니까?

패턴 일치 후 현재 행의 다음 n번째 열을 인쇄하는 방법은 무엇입니까?

다음 행의 첫 번째 열과 두 번째 열이 현재 행과 동일한 경우 각 행의 마지막 열을 현재 행에 인쇄하고 싶습니다.

내 입력 파일은

 A 123 BC
 A 123 DD
 A 123 TT
 B 456 AA
 B 456 RR
 C 789 EE

원하는 출력은

 A 123 BC DD TT
 B 456 AA RR
 C 789 EE

답변1

awk:

awk '{a[$1FS$2]=a[$1FS$2]FS$NF} END {for(i in a) print i a[i]}' 
  • a[$1FS$2]=a[$1FS$2]FS$NF연관 배열의 키를 필드 구분 기호로 구분된 처음 두 필드로 설정하고 값을 필드 구분 기호로 이전 값에 연결된 마지막 필드로 설정합니다.

  • END {for(i in a) print i a[i]}마지막에 실행되면 배열의 키를 반복 a하고 키와 해당 값을 인쇄합니다.

예:

% cat file.txt 
A 123 BC
A 123 DD
A 123 TT
B 456 AA
B 456 RR
C 789 EE

% awk '{a[$1FS$2]=a[$1FS$2]FS$NF} END {for(i in a) print i a[i]}' file.txt
A 123 BC DD TT
B 456 AA RR
C 789 EE

답변2

이는 다음과 같은 방법입니다.GNU 데이터 혼합

$ datamash -Ws groupby 1,2 collapse 3 < file | sed 's/[,\t]/ /g'
A 123 BC DD TT
B 456 AA RR
C 789 EE

sed명령은 기본 필드 및 접기 구분 기호를 공백으로 바꿉니다.

답변3

sort먼저 입력 행 과 처음 두 열과 세 번째 열의 file고유( ) 행입니다 .-u-k1,2cut

그런 다음 행을 반복하고 input 에서 pattern세 번째 열( )을 수집합니다 . 마지막으로 줄바꿈을 제거하고 일치하는 항목을 인쇄합니다.sedfiletr

pattern=$(sort -k1,2 -u < file | cut -d' ' -f1-2) 
while read -r line
do
 collect=$(sed -n 's/^'"$line"'//p' file | tr '\n' ' ')
 echo "$line $collect"
done <<<"$pattern"

답변4

sed -E '
   :loop
      $!N
      s/^(((\S+\s+){2}).*)\n\2/\1 /
   tloop
   P;D
' yourfile

결과

A 123 BC DD TT
B 456 AA RR
C 789 EE

설명하다

a를 설정 하고 다음 줄을 추가한 다음 do-while loop처음 두 필드를 패턴 공간의 동일한 필드와 pattern space비교합니다 . newline패턴 공간에서 제거할 수 있으면 루프를 반복하고 그렇게 할 수 없으면 루프를 종료합니다. 이 시점에서 첫 번째 개행 문자까지 패턴 공간을 인쇄합니다. 그리고 이 부분을 삭제하고 더 많이 돌려주세요.

관련 정보