最初の単語に基づいて行をグループ化

最初の単語に基づいて行をグループ化

ファイルの次の内容を変更するには:

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 != ""1 つの空行を 3 つの空行に変換することは避けてください。
    これにより、空行を追加しなくても処理されたファイルを再処理できます。

  • last != ""ファイルの最初の行を避ける必要があります(最後の行は空です)。

  • $1 != last""現在の最初のフィールドを前のフィールドと比較します。
    末尾を使用する""と、比較はテキストモードで行われます。それ以外の場合は、同等のawk数値が同じと見なされます。たとえば、次のようになります。

    7:first line
    7e0:second line
    7.0000:third line
    7.000000000000000000008:fourth line
    
  • {print""}空白行を印刷します(上記のすべてのテストが一致した場合)。

  • {last=$1}行の最初のフィールドを変数に保存しますlast

  • 1行の内容を印刷します(常に)。

関連情報