다음 내용이 포함된 텍스트 파일이 있습니다.
ABC 1 XYZ 1 QWE 1 GRE 1 탈황장치 2 독일 No. 2 출력 2 RTY 3 관심 장소 3 모바일NB 3 LKJ 3
예상 출력:
ABC XYZ QWE GRE DGD 기어 출력 RTY POI MNB LKJ
즉, 두 번째 열 값이 동일한 모든 단어는 공백으로 구분되어 동일한 행에 표시되어야 합니다.
답변1
awk를 사용하고 모든 입력을 메모리로 읽지 않고 입력에 나타나는 순서대로 출력 레코드를 인쇄합니다.
$ awk '
$2 != prev { if (NR>1) print rec; rec=$1; prev=$2; next }
{ rec = rec OFS $1 }
END { print rec }
' file
ABC XYZ QWE GRE
DGD GER OUT
RTY POI MNB LKJ
위에서는 입력 예에 표시된 대로 입력이 두 번째 필드 값으로 그룹화되어 있다고 가정합니다. 그렇지 않은 경우 먼저 정렬하세요.sort -k2,2 file | awk 'script'
위의 내용은 각 $2가 입력에 나타날 때 $2의 $1 세트를 메모리에 저장합니다. 그렇게 하고 싶지 않다면 $1이 발생하는 대로 인쇄할 수 있습니다.
$ awk '
$2 != prev { if (NR>1) print ""; printf "%s", $1; prev=$2; next }
{ printf "%s%s", OFS, $1 }
END { print "" }
' file
ABC XYZ QWE GRE
DGD GER OUT
RTY POI MNB LKJ
답변2
다음과 같은 작업이 수행됩니다.
awk '{a[$2]=a[$2]" "$1} END {for (i in a) print substr(a[i],2)}'
substr
선행 공백을 제거하는 데 사용됩니다.
답변3
사용밀러( mlr
)는 헤더 없이 "예쁘게 인쇄된"(공백으로 구분된) 데이터를 처리합니다.
$ mlr --pprint -N nest --ivar ' ' -f 1 then cut -f 1 file
ABC XYZ QWE GRE
DGD GER OUT
RTY POI MNB LKJ
이는 Miller 작업을 사용하여 첫 번째 필드의 항목을 축소 nest
하고 두 번째 필드의 데이터를 기준으로 그룹화합니다. 접힌 항목은 공백(명령줄에서 작은따옴표로 묶인 문자)으로 구분됩니다. 두 번째 작업은 cut
축소된 필드만 추출합니다.
답변4
사용 datamash
:
$ datamash -sW groupby 2 collapse 1 --collapse-delimiter ' ' <file | datamash cut 2
접힌 구분선에 대해서는 해당 설명서를 참조하십시오.
--collapse-delimiter=x
-c x
Use character X instead of comma to delimit items in a ‘collapse’ or ‘unique’ (aka ‘uniq’) list.