簡體   English   中英

使用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 $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 '{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

您可以刪除前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

但您似乎擁有固定的寬度字段,因此可以打印最后一個“字段”:

$ 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>
---

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM