2番目の重複行を編集する方法は?

2番目の重複行を編集する方法は?

「色ではない」ではなく、重複行をすべて見つけて、2番目の項目の最後に「色付き」を追加する方法を探しています。

これがdiff -y私が言うことです。

orginal file  - final resault

pink            pink
pink          | pink is a color
not a color     not a color
not a color     not a color 
violet          violet
violet        | violet is a color
not a color     not a color
not a color     not a color
orange          orange
orange        | orange is a color
not a color     not a color

答え1

アッ方法:

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=$0" is a color" : nl }}' file

出力:

pink
pink is a color
not a color
not a color
violet
violet is a color
not a color
not a color
orange
orange is a color
not a color

使ってもいい行変数の取得'変数の awk 入力の次のレコードを読み込みます。変わりやすい

これ並ぶコマンドを返す1記録を見つけた場合0ファイルの終わりに出会った場合。

$0!="not a color" && $0 == nl- 現在のレコードがnot a color文字列ではなく、連続した2行が同じ場合(繰り返し)


関数を使用する別の方法(substr()キーの後に文字列を挿入すると、「色」の最初の2文字を繰り返す):" is a color "

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=substr($0,1,2)" is a color "substr($0,3) : nl }}' file

出力は次のとおりです。

pink
pi is a color nk
not a color
not a color
violet
vi is a color olet
not a color
not a color
orange
or is a color ange
not a color

答え2

これまでに提供された情報から:

sed 'N;s/^\([a-z]*\)\n\1$/& is a colour/;$! P;$! D' file

パターンを[a-z]*必要に応じて調整する必要があります。もちろん、色だけが一致するのではなく、ここではすべての小文字の単語に一致します。

説明:各行のスクリプトは次の行をコマンドに追加するため、N常に行の間に改行がある連続行があります。次に、s最初の行のパターンを改行\1文字の後ろの逆参照として使用して、重複した行のみを一致させます。この場合、&一致全体が代替文字列に挿入され、指定されたテキストが2行目に追加されます。その後、P最初の改行文字を印刷してDこの部分を削除するので、2行目はまだ再起動する必要があります。$!最後の行を除くすべての行に対してこのコマンドを実行してください。なぜなら、最後の行の場合、この2行を出力する必要があるからです。デフォルトでは、これはスクリプトの最後に発生します。

テスト入力:

pink
pink
not a colour
not a colour
orange
orange
not a colour
red
blue
blue

出力は次のとおりです。

pink
pink is a colour
not a colour
not a colour
orange
orange is a colour
not a colour
red
blue
blue is a colour

答え3

sed -e '
   # not interested in empty lines or blank lines
   /^$/b
   /\S/!b

   N;                        # get the next line into pattern space
   /^\(.*\)\n\1$/!{P;D;};    # compare 2 in the pattern space as string eq
   /\nnot a color$/b;        # 2 EQUAL, they are "not a color" => NOP
   s/$/ is a color/;         # 2 EQUAL, but not "not a color" => suffix
' your_colors.file

答え4

awk '/Not a color/ { print } /pink|red|blue|red|orange/ { if( found[$1] ) { print $1, "is a color" } else { print $1; found[$1]=1 } }' /path/to/input

関連情報