我需要一些建议来以单行方式使用 sed/awk 制作下面的 bash 脚本,或者如果我可以使用 python 来代替,那么对于执行此搜索和替换任务将非常有用。
在这里,我在名为“input.txt”的文件中创建了搜索模式,其中第一列用于搜索,第二列用于替换。然后,我将每个列值分配到数组上,并使用 sed 实用程序调用 for 循环来搜索和替换“file.csv”。此更改仅发生在第三列上。
文件.csv
Symbol,Name,Value
*,yy03LN-1,LM-GA-G01
*,yy5310-4,YP-QL-A03
*,yy5310-5,YP-QL-A10
输入.txt
LM-GA-G01,LM-GA-G1
YP-QL-A03,YP-QL-A3
YP-QL-A10,YP-QL-A10
预期结果,删除第三列“0”数字
文件.csv
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10
我根据这种情况创建了一个 shell 脚本,效果更好,但我需要类似单行或短脚本的帮助来完成此任务。
#!/bin/bash
post=$(cat file.csv|awk -F "," '{print $NF}'| grep -v Index)
postar=($post)
for (( i=0; i<${#postar[@]}; ++i )); do
grep "${postar[$i]}" input.txt >> filtered.txt
done
left=$(cat filtered.txt|awk -F "," '{print $1}')
leftar=($left)
right=$(cat filtered.txt|awk -F "," '{print $2}')
rightar=($right)
for (( i=0; i<${#leftar[@]}; ++i )); do
sed -i -e 's/'"${leftar[$i]}"'/'"${rightar[$i]}"'/g' file.csv
done
input.txt
请注意:-和的行数file.csv
不同。
请建议
谢谢杰伊
答案1
以下使用CSV感知工具磨坊主( mlr
) 删除字段值中嵌入的所有数字的零填充Value
:
$ mlr --csv put '$Value = gsub($Value, "([A-Z])0+([1-9])", "\1\2")' file
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10
使用该函数Value
修改该字段,方法是匹配大写字母 ( ) 后面gsub()
出现的任何数字(可能重复) ,后跟非零数字 ( )。任何此类匹配都将替换为大写字母和非零数字,从而删除填充整数的零字符串。0
[A-Z]
[1-9]
mlr
可以使用其选项就地执行修改-I
。
答案2
如果您的文件不太大,您可以使用awk
:
awk 'BEGIN{FS=OFS=","}
NR==FNR{a[$1]=$2;next}
{print $1,$2,($3 in a ? a[$3] : $3)}' input.txt file.csv
BEGIN{FS=OFS=","}
将字段分隔符设置为,
NR==FNR
如果编号记录等于文件编号记录(如果在第一个文件中)a[$1]=$2
使用第一个字段作为键将第二个字段存储到数组中$3 in a ? a[$3] : $3
if是print$3
中的一个键else printa
a[$3]
$3
答案3
如果这不是您所需要的:
$ sed 's/0*\([0-9]*$\)/\1/' file.csv
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10
然后编辑您的问题以提供更真实的代表性示例,其中包括不起作用的情况。
答案4
如果删除的不止一个0
,可以动态生成sed
程序。
awk -F, '{printf "s/%s/%s/\n",$1,$2}' input.txt
在哪里
-F,
告诉 awk 用作,
分隔符,printf "s/%s/%s/\n",$1,$2
会产生替代
这给出了你的输入
s/LM-GA-G01/LM-GA-G1/
s/YP-QL-A03/YP-QL-A3/
s/YP-QL-A10/YP-QL-A10/
现在将其输入 sed
awk -F, '{printf "s/%s/%s/\n",$1,$2}' input.txt | sed -i -f - file.csv
在哪里
-i
使用就地版本-f -
使用来自 stdin 的 sed 指令(awk 生成的部分)