2013-03-26 44 views
1

我需要一點點的意見/這個慶典線,我試圖用awk完成幫助,慶典/ AWK內刪除

基本上,我有一個變量保持逗號分隔值,就像這樣:

"abc,abd,abf,abz,abz" 

獲取每個字段是很容易用一個簡單的awk循環

echo ${var} | awk -F"," '{for(i=1;i<=NF;i++){print $i}}' 

的問題是,有時這些逗號分隔值包含一個字符串,用逗號在中間,如:

"abc,"abd,abf,abz",abh,abr,alk" 

在這種情況下「ABD,ABF,ABZ」是一個單一的值,我要告訴awk的是什麼引號之間必須被視爲整個價值並沒有被分開,但我一事無成, 任何建議?

+0

是變量總是在同一列? – luk3thomas 2013-03-26 13:54:41

+0

沒有,可惜不是, – JBoy 2013-03-26 13:56:19

+3

由於'awk'假定場分離器的每次出現實際分隔兩個領域,它不是真的適合解析這裏提到的字段分隔符不作這樣的處理文件。使用具有CSV解析器的語言來處理您的文件;這樣的解析器已經知道如何正確處理引用的字段分隔符。 – chepner 2013-03-26 14:00:28

回答

1

我可以使用awk做的最好的。

$ echo 'abc,"xxx,yyy,zzz",abh,abr,alk' | awk -F'"' '{ 
    for(i=1;i<=NF;i++) { 
     if (i %2 == 0) { 
     printf "\""$i"\""; 
     } else { 
     n=split($i,array,","); 
     for (j=1; j<n; j++) { 
      print array[j]; 
     } 
     } 
    } 
    }' 
abc 
"xxx,yyy,zzz" 
abh 
abr 
alk 

這確實給空行,雖然:(,我仍然試圖找出爲什麼

更新:固定+縮進

+0

+1靠近。由於「,」在雙引號之前/之後以及在字段的開始/結尾處,您會變空行。此外,如果i%2爲真,則需要使用split(),而不是假如是。 – 2013-03-26 14:51:05

1

首先,你不需要循環在所有的第一個例子:

$ awk '{print}' RS=',' <<< 'abc,abd,abf,abz,abz' 
abc 
abd 
abf 
abz 
abz 

對於第二個例子,你真的想要一個適當的CSV解析器。這裏是一個python解決方案:

#!/usr/bin/env python 
from csv import reader, writer 
from sys import stdin, stdout 
writer(stdout, delimiter='\n').writerows(reader(stdin)) 

演示:

$ cat file 
abc,"abd,abf,abz",abh,abr,alk 

$ csv_delimiter.py < file 
abc 
abd,abf,abz 
abh 
abr 
alk 
+1

使用csv解析器的+1。 – Taoufix 2013-03-26 14:40:52

1

如果您在您的樣品輸入顯示第一個/最後一個雙引號,其實並不存在於你的輸入,則:

$ echo 'abc,"abd,abf,abz",abh,abr,alk' | 
awk -F\" '{ 
    for (i=1;i<=NF;i++) { 
     if (i%2) { 
      gsub(/^,|,$/,"",$i) 
      nf = split($i,a,/,/) 
      for (j=1; j<=nf; j++) { 
       print a[j] 
      } 
     } 
     else { 
      print $i 
     } 
    } 
}' 
abc 
abd,abf,abz 
abh 
abr 
alk 

如果他們再存在:

$ echo '"abc,"abd,abf,abz",abh,abr,alk"' | 
awk -F\" '{ 
    for (i=2;i<NF;i++) { 
     if (!(i%2)) { 
      gsub(/^,|,$/,"",$i) 
      nf = split($i,a,/,/) 
      for (j=1; j<=nf; j++) { 
       print a[j] 
      } 
     } 
     else { 
      print $i 
     } 
    } 
}' 
abc 
abd,abf,abz 
abh 
abr 
alk 
0

查看可讓您操作CSV文件的csvtool程序。

它可與apt-get安裝(或任何你的包管理器),並且在Bash中使用文件使用CSV文件的工作。