다른 열 값을 기반으로 열을 행 형식으로 변환해야 함

다른 열 값을 기반으로 열을 행 형식으로 변환해야 함

다음 내용이 포함된 텍스트 파일이 있습니다.

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.

관련 정보