2015-09-18 10 views
1

我有以下內容的文件:加引號的空間認識列

"aaa" "aaa bbb" "c cc c" "ddd" 

我要找的命令,將顯示我指定的列。

我嘗試使用:

awk '{print $1}' 

但如果像「C CC C」 doublequetoes空格字符它不能正常工作。

在此先感謝您的幫助。

+0

所以你覺得如何AWK識別列? –

+0

嗨Karoly,我知道它是如何工作的(它使用空格),我知道可以定義自己的字段分隔符。我不知道如何定義這樣的分隔符。 – user3461823

+0

https://www.google.com/search?q=awk+define+own+field+seperator(原文如此!) –

回答

4

您可以使用FPAT變量在GNU ,AWK打破基於正則表達式的列:

s='"aaa" "aaa bbb" "c cc c" "ddd"' 

awk -v FPAT='"[^"]+"' '{for (i=1; i<=NF; i++) printf "Field %d:: <%s>\n", i, $i}' <<< "$s" 
Field 1:: <"aaa"> 
Field 2:: <"aaa bbb"> 
Field 3:: <"c cc c"> 
Field 4:: <"ddd"> 

-v FPAT='"[^"]+"'將設置2個引號之間的每個字段值。

+1

不錯的一個。特別是'FPAT'變量。 – sat

+1

感謝您的幫助! :-) – user3461823

0

Perl來拯救!使用Text::CSV模塊:

perl -MText::CSV -lwe ' 
    my $csv = Text::CSV->new({sep_char => " "}) or die Text::CSV->error_diag; 
    open my $FH, "<", "input.txt" or die $!; 
    while (my $row = $csv->getline($FH)) { 
     print $row->[3]; 
    }' 
1

利用溶液傳統awk

echo '"aaa" "aaa bbb" "c cc c" "ddd"' | 
awk -c -F "^\"|\"[ \t]+\"|\"$" '{ 
    for(i=2; i<=NF-1; i++) 
     printf "\"%s\"\n", $i 
}' 

你:

 
"aaa" 
"aaa bbb" 
"c cc c" 
"ddd"