![ファイルからフィールドを切り取る[重複]](https://linux33.com/image/95427/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E5%88%87%E3%82%8A%E5%8F%96%E3%82%8B%5B%E9%87%8D%E8%A4%87%5D.png)
a.txtファイルの内容
Event: "112506400","17","2016/07/13-15-25-59.00",,,,,,,,,,,"112506400","115101234","02:00:00","pc","abc","4194","file_nam","F",,,"LA
",,"jk","123",,,,,,,,,,
$20(file_name) が asort.txt にリダイレクトされないファイルが必要です。現在、次のコマンドを使用しています。短いコマンドはありますか?
cat a.txt | grep Event: |awk -F, '{print $1","$2","$3","$4","$5","$6","$7","$8","$9","$10","$11","$12","$13","$14","$15","$16","$17","$18","$19","$21","$22","$23","$24","$25","$26","$27","$28","$29","$30","$31","$32","$33","$34","$35","$36","$37}'> asort.txt
答え1
おそらくcutコマンドはこれを行うことができます:
cat a.txt | cut -d "," -f 1-19,21-37
したがって、カンマが安定した区切り記号であると仮定すると、フィールド#20をスキップできます。
答え2
これは働きます:
grep Event: a.txt | awk 'BEGIN{FS=OFS=","}{$20=""; print}' > asort.txt
答え3
そしてsed
$ echo 'a,,b,c,d' | sed -E 's/^(([^,]*,){2})[^,]*,/\1/'
a,,c,d
$ echo 'a,,b,c,d' | sed -E 's/^(([^,]*,){3})[^,]*,/\1/'
a,,b,d
[^,]*,
ゼロ個以上のカンマ以外のテキストの後にカンマがある{2}
または、{3}
前のグループから2〜3回の列番号から1を引いて削除します。
perl
正規表現パターンを再利用できる点を除けば、これに似ています。
$ # (?2) refers to ([^,]*,)
$ echo 'a,,b,c,d' | perl -pe 's/^(([^,]*,){2})(?2)/$1/'
a,,c,d
$ echo 'a,,b,c,d' | perl -pe 's/^(([^,]*,){3})(?2)/$1/'
a,,b,d
$ # golfed with lookbehind
$ echo 'a,,b,c,d' | perl -pe 's/^([^,]*,){2}\K(?1)//'
a,,c,d
$ echo 'a,,b,c,d' | perl -pe 's/^([^,]*,){3}\K(?1)//'
a,,b,d