다음 줄이 포함된 파일이 있습니다.
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