【问题标题】:Using awk to extract a column containing spaces使用 awk 提取包含空格的列
【发布时间】:2016-05-12 18:11:51
【问题描述】:

我正在寻找一种从以下输出中提取文件名列的方法。

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

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

【问题讨论】:

  • 您确定这些字段没有用制表符分隔吗?试试cat file | tr "\t" "#" 确定。
  • 不幸的是它们被空格隔开
  • @CasimiretHippolyte ITYM tr "\t" "#" < file,不需要cat 和管道。

标签: awk cut


【解决方案1】:

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++) $4=$4 OFS $i; print $4}' file   

如果您的文件格式是固定的,也许使用该结构是一个更好的主意

$ cut -c36- file

vendor_20160202_67536242.WAV
vendor_20160202_67536349.WAV
vendor_20160201_67369072 - cb.mp3
vendor_20160201_67369072.mp3

【讨论】:

    【解决方案2】:

    您可以只删除前 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 的 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>
    ---
    

    【讨论】:

      猜你喜欢
      • 2022-12-05
      • 2014-05-26
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多