替换特定列和行上的数据
Replace data on specific column and row
我目前是 shell 脚本编写的新手,我在替换数据时遇到问题。我需要替换特定列和行的数据。
下面是一个随机数据库:
test:test1:test2:test3:test4
example:example1:example2:example3:example4
sample:sample1:sample2:sample3:sample4
例如,我想将单词 "test3" 替换为 "changed".. 我该如何实现?我尝试了几个命令,比如
awk -F : 'NR==n{=a}1' n="$row" a="$replace" test.txt
sed -i "$row"'s/\S\+/'"$replace"'/4' test.txt
虽然我运行这些命令没有错误,但它也没有替换我的数据。
谁能帮我解决这个问题..?
你的 awk 版本稍作修改后对我来说工作正常:
$ row=1
$ replace=changed
$ awk 'BEGIN{FS=OFS=":"}NR==n{=a}1' n="$row" a="$replace" file
test:test1:test2:changed:test4
example:example1:example2:example3:example4
sample:sample1:sample2:sample3:sample4
我已经定义了输出字段分隔符 OFS
,这样被修改的行在每个字段之间仍然有 :
。要覆盖原始文件,只需执行 awk '...' file > tmp && mv tmp file
.
这是一个 sed
一行(使用就地编辑):
#!/bin/bash
cat > /tmp/file <<EOF
test:test1:test2:test3:test4
example:example1:example2:example3:example4
sample:sample1:sample2:sample3:sample4
EOF
row=1
column=4
replace=changed
sed -i "$row"'s/^\(\([^:]*:\)\{'"$(($column - 1))"'\}\)[^:]*/'"$replace"'/' /tmp/file
cat /tmp/file
我目前是 shell 脚本编写的新手,我在替换数据时遇到问题。我需要替换特定列和行的数据。
下面是一个随机数据库:
test:test1:test2:test3:test4
example:example1:example2:example3:example4
sample:sample1:sample2:sample3:sample4
例如,我想将单词 "test3" 替换为 "changed".. 我该如何实现?我尝试了几个命令,比如
awk -F : 'NR==n{=a}1' n="$row" a="$replace" test.txt
sed -i "$row"'s/\S\+/'"$replace"'/4' test.txt
虽然我运行这些命令没有错误,但它也没有替换我的数据。 谁能帮我解决这个问题..?
你的 awk 版本稍作修改后对我来说工作正常:
$ row=1
$ replace=changed
$ awk 'BEGIN{FS=OFS=":"}NR==n{=a}1' n="$row" a="$replace" file
test:test1:test2:changed:test4
example:example1:example2:example3:example4
sample:sample1:sample2:sample3:sample4
我已经定义了输出字段分隔符 OFS
,这样被修改的行在每个字段之间仍然有 :
。要覆盖原始文件,只需执行 awk '...' file > tmp && mv tmp file
.
这是一个 sed
一行(使用就地编辑):
#!/bin/bash
cat > /tmp/file <<EOF
test:test1:test2:test3:test4
example:example1:example2:example3:example4
sample:sample1:sample2:sample3:sample4
EOF
row=1
column=4
replace=changed
sed -i "$row"'s/^\(\([^:]*:\)\{'"$(($column - 1))"'\}\)[^:]*/'"$replace"'/' /tmp/file
cat /tmp/file