使用awk提取包含空格的列

使用awk提取包含空格的列,awk,cut,Awk,Cut,我正在寻找一种从下面的输出中提取filename列的方法 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

我正在寻找一种从下面的输出中提取filename列的方法

    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 $4}'

如何将带有空格的列视为单个列?

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
救援

$ 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

您可以先删除前3个空格块,然后删除非空格块:

$ 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
但看起来您有固定宽度的字段,所以要打印最后一个“字段”,您只需执行以下操作:

$ awk '{print substr($0,32)}' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
但一般使用GNU awk的字段宽度:

$ 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>
---
$gawk-v FIELDWIDTHS='10 9 11 9999''

{对于(i=1;i您可以删除前3个空格块,然后删除非空格块:

$ 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
但看起来您有固定宽度的字段,所以要打印最后一个“字段”,您只需执行以下操作:

$ awk '{print substr($0,32)}' file
vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3
但一般使用GNU awk的字段宽度:

$ 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>
---
$gawk-v FIELDWIDTHS='10 9 11 9999''

{对于(i=1;i)您确定字段不是用制表符分隔的吗?请尝试
cat file |tr“\t”“#”
以确保它们是用空格分隔的unfortunately@CasimiretHippolyteITYM
tr“\t”“#”
,不需要
cat
和管道。是否确定字段没有用制表符分隔?请尝试
cat file | tr“\t”“#”
当然可以。它们之间用空格隔开unfortunately@CasimiretHippolyteITYM
tr“\t”“#”
,不需要
cat
和管道。