"중복 줄"을 빈 줄로 구분하세요.

"중복 줄"을 빈 줄로 구분하세요.

내 입력은 다음과 같습니다.

fruit  apple word
fruit  lemon
fruit  orange other word
meat  ham word
vegetable  salad other
vegetable  lettuce more

첫 번째 단어를 기준으로 반복되는 줄을 빈 줄로 구분하는 방법은 무엇입니까? 이와 같이:

fruit  apple word
fruit  lemon other word
fruit  orange word

meat ham word

vegetable  salad other
vegetable  lettuce more

편집: 첫 번째 단어 뒤에 공백이 있을 수 있다는 점을 언급하는 것을 잊었습니다.

답변1

이는 개인의 필요에 맞게 사용자 정의할 수 있는 기본 명령입니다.

awk '{print $0 > $1}' inputfile

편집: 죄송합니다. 귀하의 질문을 잘못 읽었다는 것을 방금 깨달았습니다. 빈 줄을 사용하여 파일을 쉽게 "다시 결합"할 수 있지만 이것이 정답이 아닙니다.

이것이 가능한 해결책이다

for file in $(awk '{print $1; print $0 > $1}' data.txt | sort | uniq)
do
  cat $file
  echo
  rm $file
done > output.txt

파일이 미리 정렬된 경우에만 awk 솔루션을 사용하십시오.

awk '{a=$1; if (b != "" && a != b) {printf "\n";}; print $0; b = a}' inputfile

don_crissti의 의견을 바탕으로 수정했습니다(감사합니다!)

awk '{if (a != "" && a != $1) {printf "\n";}; print $0; a = $1}' inputfile

답변2

이것sed해결책은 다음과 같습니다.

sed '
    /^\n/!{                             #if line do not starts from \newline 
        N                               #attach next line
        /^\(\w\+\b\).*\n\1/! s/\n/\n\n/ #if 1st word not a same insert \newline
    }
    P                                   #print 1st line (before \newline)
    D                                   #remove 1st line, return to start
    '

답변3

awk입력이 예제 입력에 표시된 대로 정렬되어 있다고 가정하는 또 다른 솔루션

$ cat ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word
meat  ham word
vegetable  salad other
vegetable  lettuce more

참고: 상태 확인 순서가 중요합니다.

$ awk '!seen[$1]++ && NR>1{printf "\n"} 1' ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word

meat  ham word

vegetable  salad other
vegetable  lettuce more


유사한 솔루션을 다음에서 사용할 수 있습니다.perl

$ perl -ane 'print "\n" if !$seen{$F[0]}++ && $. > 1; print' ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word

meat  ham word

vegetable  salad other
vegetable  lettuce more

관련 정보