使用 awk 提取包含空格的列
Using awk to extract a column containing spaces
我正在寻找一种从以下输出中提取文件名列的方法。
2016-02-03 08:22:33 610540 vendor_20160202_67536242.WAV
2016-02-03 08:19:25 530916 vendor_20160202_67536349.WAV
2016-02-03 08:17:10 2767824 vendor_20160201_67369072 - cb.mp3
2016-02-03 08:17:06 368928 vendor_20160201_67369072.mp3
其中一个文件的名称中包含空格,导致我当前的命令出现问题
awk '{print }'
如何将带有空格的列视为单个列?
awk
救援!
$ awk '{for(i=4;i<NF;i++) printf "%s", $i OFS;
printf "%s", $NF ORS}' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
或者,
$ awk '{for(i=5;i<=NF;i++) = OFS $i; print }' file
如果您的文件格式是固定的,也许使用结构是更好的主意
$ cut -c36- file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
您可以只删除前 3 个 space-then-nonspace 块:
$ awk '{sub(/^[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"")}1' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
但看起来你有固定宽度的字段,所以要打印最后一个 "field" 你可以这样做:
$ awk '{print substr([=11=],32)}' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
但一般使用 GNU awk 的 FIELDWIDTHS:
$ gawk -v FIELDWIDTHS='10 9 11 9999' '
{for (i=1;i<=NF;i++) { gsub(/^ +| +$/,"",$i); print NR, NF, i, "<" $i ">" } print "---"}
' file
1 4 1 <2016-02-03>
1 4 2 <08:22:33>
1 4 3 <610540>
1 4 4 <vendor_20160202_67536242.WAV>
---
2 4 1 <2016-02-03>
2 4 2 <08:19:25>
2 4 3 <530916>
2 4 4 <vendor_20160202_67536349.WAV>
---
3 4 1 <2016-02-03>
3 4 2 <08:17:10>
3 4 3 <2767824>
3 4 4 <vendor_20160201_67369072 - cb.mp3>
---
4 4 1 <2016-02-03>
4 4 2 <08:17:06>
4 4 3 <368928>
4 4 4 <vendor_20160201_67369072.mp3>
---
我正在寻找一种从以下输出中提取文件名列的方法。
2016-02-03 08:22:33 610540 vendor_20160202_67536242.WAV
2016-02-03 08:19:25 530916 vendor_20160202_67536349.WAV
2016-02-03 08:17:10 2767824 vendor_20160201_67369072 - cb.mp3
2016-02-03 08:17:06 368928 vendor_20160201_67369072.mp3
其中一个文件的名称中包含空格,导致我当前的命令出现问题
awk '{print }'
如何将带有空格的列视为单个列?
awk
救援!
$ awk '{for(i=4;i<NF;i++) printf "%s", $i OFS;
printf "%s", $NF ORS}' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
或者,
$ awk '{for(i=5;i<=NF;i++) = OFS $i; print }' file
如果您的文件格式是固定的,也许使用结构是更好的主意
$ cut -c36- file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
您可以只删除前 3 个 space-then-nonspace 块:
$ awk '{sub(/^[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"")}1' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
但看起来你有固定宽度的字段,所以要打印最后一个 "field" 你可以这样做:
$ awk '{print substr([=11=],32)}' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
但一般使用 GNU awk 的 FIELDWIDTHS:
$ gawk -v FIELDWIDTHS='10 9 11 9999' '
{for (i=1;i<=NF;i++) { gsub(/^ +| +$/,"",$i); print NR, NF, i, "<" $i ">" } print "---"}
' file
1 4 1 <2016-02-03>
1 4 2 <08:22:33>
1 4 3 <610540>
1 4 4 <vendor_20160202_67536242.WAV>
---
2 4 1 <2016-02-03>
2 4 2 <08:19:25>
2 4 3 <530916>
2 4 4 <vendor_20160202_67536349.WAV>
---
3 4 1 <2016-02-03>
3 4 2 <08:17:10>
3 4 3 <2767824>
3 4 4 <vendor_20160201_67369072 - cb.mp3>
---
4 4 1 <2016-02-03>
4 4 2 <08:17:06>
4 4 3 <368928>
4 4 4 <vendor_20160201_67369072.mp3>
---