
私のファイルの2番目のフィールドである同じ名前に基づいてファイルに改行文字を挿入しようとしています。したがって、私の入力ファイルは次のようになります。
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
ファイルが2番目のフィールドにソート/グループ化されているとします。
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)
:2番目のフィールドが前の行と同じでない場合(i
inは//i
大文字と小文字を区別しない)、または最初の行ではない場合。$pre=$F[1]
:この行の2番目のフィールドをとして保存します$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