다음 행의 첫 번째 열과 두 번째 열이 현재 행과 동일한 경우 각 행의 마지막 열을 현재 행에 인쇄하고 싶습니다.
내 입력 파일은
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,2
cut
그런 다음 행을 반복하고 input 에서 pattern
세 번째 열( )을 수집합니다 . 마지막으로 줄바꿈을 제거하고 일치하는 항목을 인쇄합니다.sed
file
tr
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
패턴 공간에서 제거할 수 있으면 루프를 반복하고 그렇게 할 수 없으면 루프를 종료합니다. 이 시점에서 첫 번째 개행 문자까지 패턴 공간을 인쇄합니다. 그리고 이 부분을 삭제하고 더 많이 돌려주세요.