我有一个5列csv文件(空格分隔)是这样的:
username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled 20130310 disabled
我'试图改变为第四列的值username4
。
我的剧本已经获得的行号,以及存储新值username4
:所以我想,以取代第4列值$newValue
行号$lineNumber
。
在我的示例:
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
这里有一种方法:
$ 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
这可能会为你工作(GNU SED&Bash的):
lineNumber=4 newValue=xxxx sed -i ${lineNumber}'s/\S\+/'"${newValue}"'/4' file
不过要小心了。 如果newValue
包含了/
你需要替换命令分隔符更改到别的东西如s@\S\+@${newValue}@4
文章来源: sed replace in-line a specific column number value at a specific line number