2014-11-05 71 views
1

我有這樣一個文件,其中場均製表符分隔:添加雙引號中的文件的第一個字段

http://article.wn.com/view/wnat51e64f5c0a06e3e18f45e66d5185fc04/              0  0  0  0  0  0  0  0  0  0  0  0 
http://newsok.com/ward-blanks-bruins-in-hurricanes-3-0-win./article/feed/217313?custom_click=rss      0  0  0  0  0  0  0  0  0  0  0  0 
http://www.neurosoftware.ro/finance/insurance/stock-market/zoom-ctch-wvvi-hiru-couv-stock-alerts-from-stock-pr-com/  0  0  0  0  0  0  0  0  0  0  0  0 

我想添加雙引號在文件的第一列這樣

"http://article.wn.com/view/wnat51e64f5c0a06e3e18f45e66d5185fc04/"              0  0  0  0  0  0  0  0  0  0  0  0 
"http://newsok.com/ward-blanks-bruins-in-hurricanes-3-0-win./article/feed/217313?custom_click=rss"      0  0  0  0  0  0  0  0  0  0  0  0 
"http://www.neurosoftware.ro/finance/insurance/stock-market/zoom-ctch-wvvi-hiru-couv-stock-alerts-from-stock-pr-com/"  0  0  0  0  0  0  0  0  0  0  0  0 

我嘗試這樣做:

awk -F \t '{sub($1, "\"&\""); print}' file 

我得到的結果是這樣的:

"h"ttp://article.wn.com/view/wnat51e64f5c0a06e3e18f45e66d5185fc04/              0  0  0  0  0  0  0  0  0  0  0  0 
"h"ttp://newsok.com/ward-blanks-bruins-in-hurricanes-3-0-win./article/feed/217313?custom_click=rss      0  0  0  0  0  0  0  0  0  0  0  0 
"h"ttp://www.neurosoftware.ro/finance/insurance/stock-market/zoom-ctch-wvvi-hiru-couv-stock-alerts-from-stock-pr-com/  0  0  0  0  0  0  0  0  0  0  0  0 

是否有任何建議,以解決這一問題?

+1

在'-F \ t'中,反斜槓在* shell *中引用t,所以awk將't'用作字段分隔符;使標籤使用單引號'-F'\ t''或加倍反斜線'-F \\ t'。但你似乎並不需要這個;有效的URL不能包含空格,並且看起來你的其他字段沒有,所以awk默認的FS有效[:white:] +對你來說可以。另外,你不需要'sub()'你可以做的全部行''{$ 1 =「\」「$ 1」\「」; print}''或者更易讀'-vq ='「'' {$ 1 = q $ 1q; print}'' – 2014-11-05 10:29:03

回答

1

這可以用sed輕鬆完成:

sed -r 's/^([^\t]+)/"\1"/' file 

它惹人文本的第一塊卡口前並打印回包圍(+匹配至少一個字符,感謝Jidder在評論!)雙引號。

另外,如果您使用的-F"\t"你的方法將是一件好事:(!在評論感謝anubhava)

awk -F"\t" '{sub($1, "\"&\""); print}' file 

雖然這種做法可能會更好

awk 'BEGIN{FS=OFS="\t"} NF{$1="\"" $1 "\""}1' file 

這臺輸入和輸出的字段分隔符選項卡。然後,如果有一些字段(NF至少爲1,即沒有空行),則會在第一個字段周圍添加引號。然後,1執行默認的awk操作:打印行。

+1

+1或者'awk'NF {$ 1 =「\」「$ 1」\「」} 1'文件' – anubhava 2014-11-05 10:23:48

+1

awk不會保留製表符間隔。也可以使用'sed -r's/^([^ \ t] +)/「\ 1」/''會阻止它引用空行:) – 2014-11-05 10:26:39

+1

不錯,@anubhava,再次感謝!用您的方法更新:) – fedorqui 2014-11-05 10:40:40

0
echo \t 
t 

tab字符的bash文字是$'\t'

+1

awk理解2個字符的字符串「\ t」意味着一個製表符 – 2014-11-05 11:11:59

+0

@glennjackman:true,但這不是他正在使用的。 – 2014-11-05 11:22:26

+1

啊,是的。您的回答是不明顯 – 2014-11-05 11:27:55

0

使用awk:

awk -v OFS="\t" '{$1= "\""$1"\""; print}' file 
+1

這不會預先提供標籤間距 – 2014-11-05 10:24:06

+0

@Jidder:正確 – 2014-11-05 10:24:28

+1

您不應在代碼中設置「OFS」,因爲它不需要並且不會更改。使用'awk -v OFS =「\ t」'代碼'文件'或'awk'代碼'OFS =「\ t」文件「。這可能也沒關係:'awk'代碼'OFS = \ t文件' – Jotne 2014-11-05 10:28:48

1

輕鬆使用awk做

awk '$1="\""$1"\""' OFS="\t" file 

如果有空白行

awk 'NF&&$1="\""$1"\""' OFS="\t" file 
1

使用gensub funtion另一種方式從gawk

gawk '{print gensub(/^([^[:space:]]+)/, "\"&\"", "")}' infile 

注:鴕鳥政策擔心FSOFS值。

+0

$ 0在最後不需要默認。 – 2014-11-05 11:07:36

+0

也可以使用'awk'$ 0 = gensub(/([[:graph:]] +)/,「\」&\「」,「1」)'文件' – 2014-11-05 11:16:29

+0

''$ 0''無用,正確! ..我還是喜歡用print heere @Jidder – klashxx 2014-11-05 11:18:20

0

這可能爲你工作(GNU SED):

sed 's/\S\+/"&"/' file 

圍繞一個或多個非空格的雙引號。

相關問題