두 번째 열을 기준으로 데이터 그룹화

두 번째 열을 기준으로 데이터 그룹화

다음 줄이 포함된 파일이 있습니다.

1 a
2 a
3 a
1 b
2 b
1 c
2 c
3 c
4 c
1 d

내가 얻고 싶은 결과는 다음과 같습니다

a 1 2 3
b 1 2
c 1 2 3 4
d 1

답변1

사용 awk:

awk '{ group[$2] = (group[$2] == "" ? $1 : group[$2] OFS $1 ) }
     END { for (group_name in group) print group_name, group[group_name] }' inputfile

그러면 그룹이 이름이 지정된 배열에 저장됩니다 group. 배열은 그룹 이름(입력 데이터의 두 번째 열)으로 인덱싱되며, input 의 각 행에 대해 inputfile첫 번째 열의 값이 올바른 그룹에 추가됩니다.

END블록은 수집된 모든 그룹을 반복하여 그룹 이름과 해당 그룹의 항목을 출력합니다.

awk프로그램은 더 나은 레이아웃을 가지고 있습니다:

{
    group[$2] = (group[$2] == "" ? $1 : group[$2] OFS $1 )
}

END {
    for (group_name in group)
        print group_name, group[group_name]
}

이는아니요group어레이가 실제로 많은 양의 데이터를 저장한다면 어떻게 하시겠습니까?모두파일에서 읽은 입력 데이터입니다.

대규모 데이터의 경우 입력은 다음과 같다고 가정합니다.정렬됨그룹 이름(두 번째 열)에 다음을 사용합니다.

awk '$2 != group_name { if (group != "") print group_name, group; group = ""; group_name = $2 }
    { group = (group == "" ? $1 : group OFS $1) }
    END { if (group != "") print group_name, group }' inputfile

이는 현재 그룹이 무엇인지 추적하고 해당 그룹에 대한 데이터를 수집합니다. 입력의 두 번째 열이 다른 값으로 전환될 때마다 수집된 그룹 데이터를 출력하고 새로운 데이터 수집을 시작합니다. 이는 전체 입력 데이터 세트 대신 몇 줄의 입력만 저장됨을 의미합니다.

마지막 awk프로그램의 레이아웃이 더 좋습니다.

$2 != group_name {
    if (group != "")
        print group_name, group

    group = ""
    group_name = $2
}

{
    group = (group == "" ? $1 : group OFS $1)
}

END {
    # Output last group (only), if there was any data at all.
    if (group != "")
        print group_name, group
}

답변2

이 시도,

for i in  `awk '!a[$2]++ { print $2}' file.txt`
do
        echo "$i `awk -v z=$i '$2==z{print $1}' file.txt | tr '\n' ' '`"
done
  • awk '!a[$2]++ { print $2}열 2의 고유 값을 제공합니다.
  • $2==z{print $1}변수 $2의 모든 값을 와 동일하게 인쇄합니다 z.

답변3

주문하다:for i in a b c d; do echo $i;awk -v i="$i" '$2 == i{print $1}' filename| perl -pne "s/\n/ /g";echo " "| perl -pne "s/ /\n/g";done| sed '/^$/d'| sed "N;s/\n/ /g"

산출

for i in a b c d; do echo $i;awk -v i="$i" '$2 == i{print $1}' l.txt | perl -pne "s/\n/ /g";echo " "| perl -pne "s/ /\n/g";done| sed '/^$/d'| sed "N;s/\n/ /g"

a 1 2 3 
b 1 2 
c 1 2 3 4 
d 1

관련 정보