2016-06-08 62 views
0

我有一個如下所示的輸入文件。問題在於該文件是由管道分隔的,並且可以使用雙引號括起來。它是在第三場在字符串的結尾錯過,我可以看到,它發生每當長度超過2說附上一個缺少雙引號的字符串

"SER1828"|"ZXC"|"A1"|10002 
"SER1878"|"IOP"|"B1"|98989 
"SER1930"|"QWE"|"A2"|10301 
"SER1930"|"QWE"|"Asdf2|10301 # 3rd field -> closing " missed out 

輸出應該看起來像

"SER1828"|"ZXC"|"A1"|10002 
"SER1878"|"IOP"|"B1"|98989 
"SER1930"|"QWE"|"A2"|10301 
"SER1930"|"QWE"|"Asdf2"|10301 

我與努力一些awk命令但無法實現。

awk -F'|' -v q=\" '{$3=$3 q;}1' OFS=| temp 
awk -F'|' -v q=\" '{if (length($3) > 2) ($3=$3;}1)}' OFS='|' temp 
+0

在您的雙引號封裝的數據,有沒有管道?像...有沒有不是分隔符的管道的數據?如果沒有,那麼只需用'gsub'將雙引號括出來,然後用'print'將它們粘貼回來。 – JNevill

+0

沒有這樣的非定界管道,但要注意的是有一些沒有附帶雙引號的字段。查看編輯 – SriniV

+0

是否只有缺失的結尾報價?在引用字段內還可以有管道嗎? – 123

回答

2

使用awk你可以寫,

awk -F'"?\\|' -vOFS='"|' '{print $1, $2, $3, $4}' 

awk -F'"?\\|' -vOFS='"|' '{print $1, $2, $3, $4}' input 
"SER1828"|"ZXC"|"A1"|10002 
"SER1878"|"IOP"|"B1"|98989 
"SER1930"|"QWE"|"A2"|10301 
"SER1930"|"QWE"|"Asdf2"|10301 

  • 它能做什麼?

  • -F'"?\\|'設置輸入字段分隔符要麼"||

  • -vOFS='"|'設置日提交的分離器,以"|輸出。此設置始終,那就是即使輸入分隔符是|"|


或者你也可以寫

的awk -F「」\ |? -vOFS = '「|' '1'輸入

這裏1總是評估爲true,在這種情況下,它將打印整個行。

awk -F'"?\\|' -vOFS='"|' '1' input 

awk -F'"?\\|' -vOFS='"|' '{$1=$1}1' input 

見@肯特的評論。


編輯

如果您要添加的報價僅第三基於長度申請,你可以寫類似

awk -F'|' -vOFS='|' '{print $1, $2, $3(length($3)>4 ? "\"" : ""), $4}' 
+0

非常好的第一個片段。第二個不起作用。 – SriniV

+0

@realspirituals我不好,把它從答案中刪除。 – nu11p01n73R

+0

如果你想使用簡寫形式,你可以試試'$ 1 = $ 1'或'{$ 1 = $ 1} 1'而不是'1',這樣就會應用OFS。 – Kent

1

這個sed的一行代碼適用於給定的例子:

sed 's/\([^"]\)|"/\1"|"/' file # this only works for the original example 

這適用於原始的和當前的例子:

sed 's/\([^"]\)|/\1"|/' file 
+0

對不起肯特,只是編輯了這篇文章。有沒有雙引號的字段。我只需要一個特定的領域而不是整個文件 – SriniV

+0

@realspirituals我加了一些評論,第二個sed的作品都是兩個例子(舊的和更新的) – Kent

+0

你能解釋一下嗎?這個替代組是什麼? – SriniV

0
awk '{sub(/Asdf2/,"Asdf2\"")}1' file 
"SER1828"|"ZXC"|"A1"|10002 
"SER1878"|"IOP"|"B1"|98989 
"SER1930"|"QWE"|"A2"|10301 
"SER1930"|"QWE"|"Asdf2"|10301 
+0

Nopes,這不適用於問題陳述,但適用於給定的數據集。 – SriniV