내 파일의 두 번째 필드인 동일한 이름을 기반으로 파일에 개행 문자를 삽입하려고 합니다. 따라서 내 입력 파일은 다음과 같습니다.
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)
: 두 번째 필드가 이전 행과 동일하지 않거나(i
in은//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