「重複行」を空行に区切ります。

「重複行」を空行に区切ります。

私の入力は次のとおりです。

fruit  apple word
fruit  lemon
fruit  orange other word
meat  ham word
vegetable  salad other
vegetable  lettuce more

最初の単語に基づいて繰り返される行を空行に区切る方法は?このように:

fruit  apple word
fruit  lemon other word
fruit  orange word

meat ham word

vegetable  salad other
vegetable  lettuce more

編集:最初の単語の後にスペースがある可能性があることに言及するのを忘れました。

答え1

これは、個人のニーズに合わせてカスタマイズできる基本的なコマンドです。

awk '{print $0 > $1}' inputfile

編集:申し訳ありません。あなたの質問を誤って読んだことに気づきました。空行を使用してファイルを簡単に「再結合」できますが、これは正解ではありません。

これが可能な解決策です

for file in $(awk '{print $1; print $0 > $1}' data.txt | sort | uniq)
do
  cat $file
  echo
  rm $file
done > output.txt

ファイルが事前にソートされている場合にのみ、awkソリューションを使用してください。

awk '{a=$1; if (b != "" && a != b) {printf "\n";}; print $0; b = a}' inputfile

don_crisstiのコメントに基づいて修正しました(ありがとうございます!)

awk '{if (a != "" && a != $1) {printf "\n";}; print $0; a = $1}' inputfile

答え2

これsed解決策は次のとおりです。

sed '
    /^\n/!{                             #if line do not starts from \newline 
        N                               #attach next line
        /^\(\w\+\b\).*\n\1/! s/\n/\n\n/ #if 1st word not a same insert \newline
    }
    P                                   #print 1st line (before \newline)
    D                                   #remove 1st line, return to start
    '

答え3

awk入力がサンプル入力に示されているように整列していると仮定する別の解決策

$ cat ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word
meat  ham word
vegetable  salad other
vegetable  lettuce more

注:ヘルスチェックの順序は重要です。

$ awk '!seen[$1]++ && NR>1{printf "\n"} 1' ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word

meat  ham word

vegetable  salad other
vegetable  lettuce more


同様のソリューションを次のように使用できます。perl

$ perl -ane 'print "\n" if !$seen{$F[0]}++ && $. > 1; print' ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word

meat  ham word

vegetable  salad other
vegetable  lettuce more

関連情報