
私はそれを使用して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