2012-01-24 24 views
0

我有一個包含3列的文件,第2列是lat/long,可能有也可能沒有數據。向unix中的兩個字段添加雙引號

2012-01-10 21:27:52.811,,ABC -- No lat/long 
2012-01-10 21:27:52.811,37.8889329,-112.1876328,XYZ -- with lat long 

有人可以幫我一個SED/AWK/perl的將其轉換爲

2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ 

在所有其他情況下,它不應該添加任何雙引號

在此先感謝

+1

爲什麼它必須是單線?你在哪個部分掙扎?另外*多少個*列?什麼是分隔符? – Johnsyweb

+0

編輯的問題,一個班輪會更好,但我會很高興與任何答案開始..謝謝.. – learner

+1

我從來沒有明白爲什麼人們認爲單線更好。他們顯然從來不需要維護其他人的單線隊員。 – Johnsyweb

回答

3

我可能會這樣做,使用awk

% echo '2012-01-10 21:27:52.811,,ABC -- No lat/long 
2012-01-10 21:27:52.811,37.8889329,-112.1876328,XYZ -- with lat long 
' | awk -F',' -v OFS=',' ' 
$2 && $3 { 
    $2 = "\"" $2 
    $3 = $3 "\"" 
} 

1 
' 
2012-01-10 21:27:52.811,,ABC -- No lat/long 
2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ -- with lat long 

這假定這些字段在進出的路上以逗號分隔。

如果第二和第三個字段被填充然後

  • 將一個"第二場
  • 將前一個"第三字段

打印的所有行(1)之後。

這裏有很多假設,所以你必須挖掘sed & awk book並調整它以滿足你的需求。

+1

@learner,這將是這種優良解決方案的單線 - 'awk'$ 2 {$ 2 =「\」「$ 2; $ 3 = $ 3」\「」} 1'FS = OFS =','filename' ... + 1到解決方案 –

+0

@Jaypal:我故意沒有把這一切全部放在一行上。感謝您證明爲什麼! – Johnsyweb

0

只需使用bash:

oldIFS=$IFS 
IFS=, 

while read a b c d; do 
    if [[ -z "$d" ]]; then 
     printf "%s,,%s\n" "$a" "$c" 
    else 
     printf "%s,\"%s,%s\",%s\n" "$a" "$b" "$c" "$d" 
    fi 
done <filename> filename.new 

IFS=$oldIFS 
1

這可能會爲你工作:

sed '/^[^,]*,,/!s/,\([^,]*,[^,]*\)/,"\1"/' file 
2012-01-10 21:27:52.811,,ABC -- No lat/long 
2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ -- with lat long 
0

給定的約束,你可以使用sed和指定的字段改變:

sed '/,,/! s/,/,"/1; s/,/",/3' 

這是通過限制替換僅限於兩個逗號,,不會發生的行一起。在將進行替換的行中,我們使用數字標誌在第一個逗號之後和第三個逗號之前添加雙引號。