개행 문자로 입력 파일 분할

개행 문자로 입력 파일 분할

내 파일의 두 번째 필드인 동일한 이름을 기반으로 파일에 개행 문자를 삽입하려고 합니다. 따라서 내 입력 파일은 다음과 같습니다.

17412193|name1|organization
43979400|name1|organization
1405541|name2|organization
53595498|name2|organization
50439202|name2|organization
54678379|name3|Not Found
21757330|name3|organization

그래서 나는 이런 결과를 얻으려고 노력하고 있습니다.

17412193|name1|organization
43979400|name1|organization
###linebreak inserted here
1405541|name2|organization
53595498|name2|organization
50439202|name2|organization
###linebreak inserted here
54678379|name3|Not Found
21757330|name3|organization
###linebreak inserted here

이 개행 문자를 사용하여 입력 파일을 분할하고 유사한 이름을 그룹화합니다. 나중에 이러한 그룹 이름에 유사성 알고리즘을 적용하겠습니다. 따라서 위의 예에서는 출력 후 3쌍의 이름에 유사성 알고리즘을 적용하겠습니다.

답변1

파일이 두 번째 필드로 정렬/그룹화되었다고 가정합니다.

awk -F '|' 'NR>1 && $2 != prev {print ""} {prev=$2; print}' file

답변2

대소문자를 구분하지 않는 Perl 솔루션은 다음과 같습니다.

perl -F'\|' -lape 'unless($F[1]=~/^$pre$/i || $.==1){print ""}; $pre=$F[1]' file 

설명하다:

  • Perl이 awk처럼 동작하도록 -a입력 라인을 배열로 분할합니다 .@F
  • -F필드 구분 기호 입니다
  • -p각 입력 라인을 인쇄하는 것을 의미합니다.
  • -l\n각 인쇄 호출에 1을 추가하므로 print ""개행이 인쇄됩니다.
  • unless($F[1]=~/^$pre$/i || $.==1): 두 번째 필드가 이전 행과 동일하지 않거나( iin은 //i대소문자를 구분하지 않음) 첫 번째 행이 아닌 경우입니다.
  • $pre=$F[1]: 이 행의 두 번째 필드를 로 저장합니다 $pre.

@GlennJackman은 주석에서 약간 다른 버전을 제안했는데, 큰 파일의 경우 더 빠를 수 있습니다.

perl -F'\|' -lape 'unless(lc($F[1]) eq lc($pre) || $.==1){print ""}; $pre=$F[1]' file 

답변3

더 짧은 Perl 솔루션:

perl -pe 'print "\n" if ($l =~ /name\d+/ && $_ !~ /$&/);$l=$_;' input
  • 마지막 줄( $l) name\d+이 현재 줄과 마지막으로 일치하지 않으면 새 줄을 인쇄합니다.
  • 현재 행을 다음에 할당합니다.$l

보다 일반적인 솔루션

perl -pe 'print "\n" if ($l =~ /\|([^\|]+)/ && $_ !~ /$1/);$l=$_;'  input

답변4

#!/bin/sh
#shell basics, POSIX compliant
(set -f ;IFS='|
' ; set -- $(cat) ; while [ -n "$3" ] ;do {
[ "${t=$2}" != "$2" ] && echo && t=$2
printf '%s|%s|%s\n' "$1" "$2" "$3" ; shift 3 
} ; done )<<\SAMPLE
17412193|name1|organization 
43979400|name1|organization 
1405541|name2|organization 
53595498|name2|organization 
50439202|name2|organization 
54678379|name3|Not Found 
21757330|name3|organization
SAMPLE

Output

17412193|name1|organization 
43979400|name1|organization 

1405541|name2|organization 
53595498|name2|organization 
50439202|name2|organization 

54678379|name3|Not Found 
21757330|name3|organization

관련 정보