0

パイプ区切りファイル (以下のサンプル) があり、フィールド 2 (email)、4 (mailing-id)、6 (comm_id) に Null 値を持つレコードを削除する必要があります。このサンプルでは、​​行 2、3、4 を削除する必要があります。出力は別のファイルに保存する必要があります。「awk」が最適なオプションである場合は、これを実現する方法を教えてください

id|email|date|mailing-id|seg_id|comm_id|oyb_id|method
|-fabianz-@yahoo.com|2010-06-23 11:47:00|0|1234|INCLO|1000002|unknown
||2010-06-23 11:47:00|0|3984|INCLO|1000002|unknown
|-maddog-@web.md|2010-06-23 11:47:00|0||INCLO|1000002|unknown
|-mse-@hanmail.net|2010-06-23 11:47:00|0||INCLO|1000002|unknown
|-maine-mei@web.md.net|2010-06-23 11:47:00|0|454|INCLO|1000002|unknown
4

3 に答える 3

1

Steve の言うとおりです。与えられたサンプルで欠けているのはフィールド 2 と 5 です。2 行目の電子メールが欠落しており、3 行目と 4 行目の seq_id が欠落している

これは、スティーブのソリューションのわずかに単純化されたバージョンです

awk -F "|" ' $2!="" && $5!=""' file.txt > results.txt

列 2、4、および 6 が重要な場合、解決策は次のようになります。

awk -F "|" ' $2!="" && $4!="" && $6!=""' file.txt > results.txt
于 2012-06-22T14:31:48.933 に答える
1

これがawk役立つ解決策です。ただし、行 2、3、および 4 を削除するには、フィールド 2 および 5 のみで null 値を確認する必要があります (つまり、前述のようにフィールド 2、4、および 6 ではありません)。私は物事を正しく理解していますか?これがあなたawkが望むことをすることです:

awk -F "|" '{ if ($2 == "" || $5 == "") next; print $0 }' file.txt > results.txt

cat results.txt:

id|email|date|mailing-id|seg_id|comm_id|oyb_id|method
|-fabianz-@yahoo.com|2010-06-23 11:47:00|0|1234|INCLO|1000002|unknown
|-maine-mei@web.md.net|2010-06-23 11:47:00|0|454|INCLO|1000002|unknown

HTH

于 2012-06-22T03:48:58.033 に答える
0

これはあなたのために働くかもしれません:

 sed 'h;s/[^|]*/\n&/2;s/[^|]*/\n&/4;s/[^|]*/\n&/6;/\n|/d;x' file.txt > results.txt
于 2012-06-22T05:41:12.997 に答える