2014-11-05 72 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 

围绕一个或多个非空格的双引号。

相关问题