
スペース、ダッシュ、スペースで区切られたさまざまな英数字文字列の行を含むファイルがあります。ただし、英数字の値と区切り文字が 1 つだけ存在し、他の文字列値が欠落している行があります。例:
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
DK0060056323-DKK -
DK0060186294-DKK -
上記のサンプルの最後の 2 行には、区切り文字の右側に英数字の文字列がないため、これを削除したいと思います。次の awk 式を使用しようとしました。
awk '!/* - /' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt
つまり!/* - /
、「任意の文字 (*) の後にスペース、ダッシュ、スペース ( - ) があり、その後に何もないパターンを探し、そのようなパターンが見つからない場合 (!)」、残りの行を temp.txt ファイルに移動し、sourcefile.txt の内容を temp.txt の内容に置き換えます。ただし、上記の awk スクリプトを実行すると、sourcefile.txt の内容には何も起こりません。すべてが同じままです。エラーも発生しません。何が間違っているのでしょうか? 上記のサンプル行を考慮すると、awk スクリプトを実行した後の目的の出力は次のようになります。
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
答え1
英数字で終わる行を印刷するには、次のようにします。
$ awk '/[[:alnum:]]$/' file
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
答え2
さらにシンプルに:
awk '$3' inputfile
これは の略語でありawk '$3!=""'
、 は の略語でありawk '$3!=""{print}'
、 は の略語である。awk '$3!=""{print $0}'
記録のために:
sed /-$/d
おそらくより速く、grep -ve '-$'
さらにさらに速くなります。
答え3
@guillermo chamorro の提案のおかげで、スクリプトを次のように変更して目的の出力を実現することができました。
awk '!/^.* -$/' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt
ありがとう、ギレルモ。