다음과 같은 테이블이 있습니다
fruits shopname
Apple x1
orange x1
banana x2
Apple x3
orange x2
banana x3
열 1을 기준으로 모든 행을 그룹화하고 중복 항목을 공백으로 바꾸고 싶습니다.
아래와 같이 보일 것입니다.
fruits shopname
Apple x1
x3
banana x2
x3
orange x1
x2
명령을 사용하여 중복 항목을 제거 할 수 있다는 것을 알고 있습니다 uniq
. 하지만 여기서는 그룹화하고 중복 항목을 공백으로 바꾸고 싶습니다.
답변1
파일을 한 줄씩 읽고 과일과 과일을 결합하는 함수를 빌드해야 합니다.목록매장번호. awk의 다차원 배열 또는 GNU awk의 배열 배열을 사용하여 이를 수행할 수 있습니다.
그런 다음 파일을 읽은 후 과일을 반복하고 각 과일에 대한 각 매장의 줄을 인쇄합니다.
나는 이 목적으로 Perl을 사용하겠지만 Perl의 구문은 약간 압도적일 수 있습니다.
perl -lane '
if ($. == 1) {print; next}
push @{$shops{$F[0]}}, $F[1];
}END{
for $fruit (sort {lc $a cmp lc $b} keys %shops) {
$label = $fruit;
for $shop (@{$shops{$fruit}}) {
printf "%s\t%s\n", $label, $shop;
$label = "";
}
}
' file
답변2
나는 동일한 결과를 얻기 위해 다음 방법을 사용했습니다.
for i in `awk '{print $1}' y.txt| sort| uniq| tr "\n" " "`; do awk -v i="$i" '$1 == i {print $2}' y.txt| sed "1s/.*/$i\t&/g"| sed '/^x/s/.*/\t&/g';done| sed '1i fruits shopname '
산출
fruits shopname
Apple x1
x3
banana x2
x3
orange x1
x2
답변3
노력하다:
sort -t $'\t' <(tail -n+2 infile) |awk 'seen[$1]++{ $1="" }1' OFS='\t'
Apple x1
x3
banana x2
x3
orange x1
x2
빈 과일 이름이 필요한 이유를 이해하지 못합니다. 필요한 데이터를 쿼리하고 결과를 제외한 모든 항목을 비어 있는 것으로 간주할 수 있습니다.
sort -t $'\t' -uk1,1 <(tail -n+2 infile)
Apple x1
banana x2
orange x1
답변4
다른 버전은 sed를 사용하지만 첫 번째 버전은 입력 파일을 생성합니다.
set +H
이 명령을 실행하기 전에 bash 기록 확장을 비활성화 하십시오.
암호:(복사하여 쉘에 붙여넣기)
# replace comma with tab to enable copy&paste from stackexchange,
# sort the table, write the file
cat <<EOF | tr ";" "\t" |sort > fruits.txt
Apple;x1
orange;x1
banana;x2
Apple;x3
orange;x2
banana;x3
EOF
echo "BEFORE:"
cat fruits.txt
for fruit in $(cut -f1 fruits.txt|sort -u); do sed -i "/$fruit/!b;n;s/^\w\+//" fruits.txt; done
echo "RESULT:"
cat fruits.txt
산출:
BEFORE:
Apple x1
Apple x3
banana x2
banana x3
orange x1
orange x2
RESULT:
Apple x1
x3
banana x2
x3
orange x1
x2