2013-03-21 32 views
3

代替我有5列csv文件(空格分隔)是这样的:SED在线特定列号值在特定行号

username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled 20130310 disabled 

我'试图改变第四值列为username4

我的脚本已经获得行号和存储username4的新值:所以我想用行号$lineNumber$newValue代替列4的值。

在我的示例:

newValue=anything 
lineNumber=4 

,使其呈现:

username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

我打算使用sed,而不是awk因为sed,我们可以在网上做-i

改变
+0

你已经试过了什么? – 2013-03-28 01:32:52

回答

11

以下是单程:

$ sed '/^username4/{s/ [^ ]*/ anything/3}' file 
username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

# store changes back to the file 
$ sed -i '/^username4/{s/ [^ ]*/ anything/3}' file 

但是回避awk因为sed-i选项不是很好的理由。 awk更适合处理这类问题。

$ awk '$1=="username4"{$4="anything"}1' file 
username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

# store changes back to the file 
$ awk '$1=="username4"{$4="anything"}1' file > tmp && mv tmp file 

随着awk您可以轻松地做实地对比和编辑,使用shell变量是不是一个噩梦引用和理解你只昨天写剧本是不是和问题不像sed

$ linenumber=4 

$ newvalue=anything 

$ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file 
username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

$ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file > tmp && mv tmp file 
1

这可能会为你工作(GNU sed的&击):

lineNumber=4 newValue=xxxx sed -i ${lineNumber}'s/\S\+/'"${newValue}"'/4' file 

但是要小心了。如果newValue包含/,则需要将替换命令分隔符更改为其他值。 [email protected]\S\[email protected]${newValue}@4

+0

这工作得很好! – user2196728 2013-03-29 11:29:53