중복을 제거하고 공백으로 대체

중복을 제거하고 공백으로 대체

다음과 같은 테이블이 있습니다

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

관련 정보