2017-12-11 38 views
1

文字列"#DONE"がまだ入っていないテキストファイルの最初の行の最後に、sedまたはawkのようなUnixコマンドを使用して、文字列"#DONE"を追加します。パターンを含まない最初の行にテキストを追加しますか?

例えば、私は、スクリプトのこのタイプを経験していない、と私は検索したことができますが、入力ファイルは

qsub job1.sh #DONE 
qsub job2.sh #DONE 
qsub job3.sh 
qsub job4.sh 

ようなものになるだろうと所望の出力は

qsub job1.sh #DONE 
qsub job2.sh #DONE 
qsub job3.sh #DONE 
qsub job4.sh 

だろうこのための正確な解決策は見つかりませんでした。

答えて

3

Awkアプローチ:

awk '!f && !/#DONE$/{ $0=$0 "#DONE"; f=1 }1' file 

出力:fileはあなたのファイル(場所2回)である

qsub job1.sh #DONE 
qsub job2.sh #DONE 
qsub job3.sh #DONE 
qsub job4.sh 
+1

あなたの方法は良いです:-)しかし、 "#DONE"; '' #DONE ";'私は思って、ファイルを更新する必要があります> tmp && mv tmp "file" 'またはそう – Ivonet

0

パイプaproach

grep -nrv -m1 "#DONE" "file" | awk -F ":" '{print $2}' | xargs -I {} awk 'FNR=={},FNR=={}{$3="#DONE"};1' "$1" >tmp && mv tmp "file" 

これは限り動作しますあなたは完全に#DOではありませんNE。

ことがhappends場合は、ファイルが

:-)空になります。これは、(GNU SED)あなたのために働くかもしれないまだ

2

を1つを考え出したていない:

sed '/#DONE$/!{s/$/#DONE/;:a;n;ba}' file 

追加#DONEそれを持っていない最初の行に、ファイルの残りの部分を出力します。

2

awk

awk -v k="#DONE" '$NF!=k && !c++{$++NF=k}1' file 

!c++それは一度だけ行われるようになります、$++NF=kフィールドの数をインクリメントした値に最後のフィールドを設定します。

関連する問題