첫 번째 단어를 기준으로 행 그룹화

첫 번째 단어를 기준으로 행 그룹화

파일의 다음 내용을 수정하는 방법:

cat:persian/young-1
cat:winter/young-2
cat:summer/wild-3
dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3

도착하다:

cat:persian/young-1
cat:winter/young-2
cat:summer/wild-3

dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3

이는 개나 고양이에만 국한된 것이 아니며 첫 번째 단어/용어를 상징적으로 표현한 것입니다.

답변1

다음을 수행할 수 있습니다.

awk -F: 'NR>1 && $1 "" != last {print ""}; {print; last = $1}'

이는 ""강제 문자열 비교입니다. 이것이 없으면 입력 시 제대로 작동하지 않습니다. 예를 들면 다음과 같습니다.

100:foo
100:bar
1e2:baz
1e2:biz

여기서 100및 는 1e2숫자로 비교됩니다.

답변2

이것은 한 가지 방법입니다. 첫 번째 필드가 이전 줄의 필드와 다른 경우 구분선을 인쇄합니다...

$ awk -F: '$1!=a&&a{print ""}{a=$1}1' myfile
cat:persian/young-1
cat:winter/young-2
cat:summer/wild-3

dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3
$

설명하다:

  • -F:= 필드 구분 기호를 다음으로 설정합니다.:
  • $1!=a&&a= 첫 번째 필드가 변수 "a"(이전 첫 번째 필드)와 같지 않고 변수 "a"가 어떤 값으로 설정된 경우(즉, 파일의 첫 번째 줄을 처리하지 않음)
  • {print ""}= 빈 줄을 인쇄합니다
  • {a=$1}= 읽은 각 줄에 대해 변수 "a"를 첫 번째 필드로 설정합니다.
  • 1= 이 줄을 인쇄하세요

답변3

나는 이런 식으로 노력한다

en ~]# awk '/cat/{print $0}' filename| sed '$s/.*/&\n/g';awk '/dog/{print $0}' filename

cat:persian/young-1
cat:winter/young-2
cat:summer/wild-3

dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3
[root@praveen ~]#

답변4

이는 awk를 사용하여 수행할 수 있습니다.

awk -F: ' $0!="" && last!="" && $1!=last"" {print""} {last=$1} 1'
  • -F ::문자의 필드를 분할하는 데 사용됩니다 .

  • $0 != ""하나의 빈 줄을 세 개의 빈 줄로 변환하는 것을 피해야 합니다.
    이를 통해 빈 줄을 추가하지 않고도 처리된 파일을 다시 처리할 수 있습니다.

  • last != ""파일의 첫 번째 줄을 피해야 합니다(마지막 줄은 비어 있음).

  • $1 != last""현재 첫 번째 필드를 이전 필드와 비교합니다.
    후행을 사용 ""하면 비교가 텍스트 모드에서 수행됩니다. 그렇지 않으면 동등한 awk숫자 값이 동일한 것으로 간주됩니다. 예를 들면 다음 과 같습니다.

    7:first line
    7e0:second line
    7.0000:third line
    7.000000000000000000008:fourth line
    
  • {print""}빈 줄을 인쇄합니다(위의 모든 테스트가 일치하는 경우).

  • {last=$1}행의 첫 번째 필드를 변수에 저장합니다 last.

  • 1줄의 내용을 인쇄합니다(항상).

관련 정보