改行文字で入力ファイルを分割する

改行文字で入力ファイルを分割する

私のファイルの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番目のフィールドが前の行と同じでない場合(iinは//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
  • 最後の行($lname\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

関連情報