我有一个5列csv文件(空格分隔),如下所示:
username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled 20130310 disabled
Run Code Online (Sandbox Code Playgroud)
我试图改变第四列的值username4.
我的脚本已经获取行号和要存储的新值username4:所以我想将第4列值替换$newValue为行号$lineNumber.
在我的样本中:
newValue=anything
lineNumber=4
Run Code Online (Sandbox Code Playgroud)
这样它将呈现:
username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled anything disabled
Run Code Online (Sandbox Code Playgroud)
我计划使用sed而不是awk因为sed我们可以用线进行更改-i
Chr*_*our 14
这是一种方式:
$ 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
Run Code Online (Sandbox Code Playgroud)
但避免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
Run Code Online (Sandbox Code Playgroud)
有了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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35243 次 |
| 最近记录: |