カンマ区切りのファイルがあります。特定のテキストを見つけて、行全体を削除する必要があります。
例えば
123,aaa,bbb,888,8881
124,bbb,ccc,999,8881
125,ccc,ddd,888,8883
888を含む行を削除する必要があります。
答え1
使用sed
、
sed '/888/d' filename
-i
オプションを使用して、次のファイルを編集できます。
sed -i.bak '/888/d' filename
メモ: .bak
元のファイルのバックアップが保持されます。
特定の列を含む行を削除し、888
次を使用する必要があるとします。
awk -F"," '$4 != "888"' filename
答え2
使用grep
grep -vw '888' infile.csv > outfile.csv
その場で編集したい場合は、
sed -i.bak '/\b888\b/d' infile.csv
編集する:
888
4列のみを含む行の削除
sed -i.bak -r '/^(([^,]+,){3})888,/d' infile.csv
答え3
IMOではprintf
パイプコマンドを使用するed
ことがsed -i
。
printf '%s\n' 'g/,888,/d' 'w' | ed -s msalik.txt
最初の引数は、残りの各引数を改行文字()で区切ってprintf
印刷するように指示します。\n
最後の2つの主張のどれも実際に引用を必要としません。私はそれらを例として引用しています。一部のed
コマンドには引用が必要です。
なぜed
より良いですかsed -i
?
ed
とは異なり、sed -i
実際の内部編集は行われません。一時出力ファイルを作成し、名前を元のファイルに変更します。これには2つの潜在的な副作用があります。
umask
一時ファイルを作成した理由によっては、ファイルの権限が変更されることがあります。他のユーザー(もちろん、ファイルとディレクトリへの適切なRWアクセス権を持つユーザー)がスクリプトを実行すると、所有権またはsed -i
グループも変更される可能性があります。代替ファイルには異なるinodeがあります。これによりハードリンクが切断されます。