gpt4 book ai didi

linux - sed 内联替换特定行号处的特定列号值

转载 作者:IT王子 更新时间:2023-10-29 00:47:56 27 4
gpt4 key购买 nike

我有一个像这样的 5 列 csv 文件(空格分隔):

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

我正在尝试更改 username4 的第 4 列的值。

我的脚本已经获取了行号和要为 username4 存储的新值:所以我想在行号 处用 $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

最佳答案

这是一种方法:

$ 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

但是因为 sed-i 选项而避免使用 awk 并不是一个好的理由。 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

关于linux - sed 内联替换特定行号处的特定列号值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15557206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com