awk - 行がまだ存在しない場合にのみ行を追加します。

awk - 行がまだ存在しない場合にのみ行を追加します。

私はそれを使用してawkファイルを解析し、その行がまだ存在しない場合にのみ行を追加したいと思います。

私のファイル:

cccc
dddd
aaaa
mmm

実施例1:私が探しています」ああああ

"aaaa"が存在するため、何も起こらず、出力ファイルは同じです。

実施例2:私が探しています」カップル

"bbbb"が存在しません。私の出力ファイルは次のようになります。

cccc
dddd
aaaa
mmm
bbbb

この結果をどのように取得できますか?

答え1

$ awk -v x='aaaa' '$0 == x {found=1} END {if(!found) print x} 1' file
cccc
dddd
aaaa
mmm

$ awk -v x='bbbb' '$0 == x {found=1} END {if(!found) print x} 1' file
cccc
dddd
aaaa
mmm
bbbb

答え2

一度に処理したい場合

line=aaaa
grep -Fx -q "$line" file || echo "$line" >> file

すべての可能性を事前に知っていれば、より効率的です。

$ cat lines_to_add
aaaa
bbbb

$ grep -Fx -f file -v lines_to_add >> file

$ cat file
cccc
dddd
aaaa
mmm
bbbb

答え3

GNU sedがある場合、これは素晴らしいオプションです:

$ sed -z '/bbbb/!s/$/bbbb\n/' file > file.out
$ cat file.out
cccc
dddd
aaaa
mmm
bbbb

この-zフラグは、sedがファイルを改行で区切られているのではなく、NULLバイトで区切られたと解釈するようにします。これにより、すべての行がパターン空間にすぐに入力され、ファイル全体()で正規表現が見つからない場合、見つからなかった行と改行がファイル/bbbb/!()の末尾に追加されますs/$/bbbb\n/。 POSIX規格によると、最後の改行文字が必要です。それ以外の場合、出力ファイルはテキストファイルではありません。

行を変数として提供するには:

line=bbbb
sed -z /"$line"'/!s/$/'"$line"'\n/' file > file.out

答え4

awkでこれを行う1つの方法は、入力ファイルを2回提供することです。

$ awk '
  FNR == NR { next }
  /bbbb/, 0 { print; next }
  NR == 2*FNR { $0 = $0 ORS "bbbb"}1
' file file 

上記と同じ方法ですが、sedコマンドを使用します。

sed -e '
  /bbbb/,$b
  $a bbbb
' file

関連情報