csv Sed替换在Bash脚本循环中不起作用

2vuwiymt  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(99)

我无法在循环中使用sed命令替换txt文件中的字符串。我的问题描述和我使用的代码如下:
我有两个表如下。
adminuser.txt

48 yimenju
50 dolwdow

result.txt

yimenju 1
yimenju 2
dolwdow 3

我想将result.txt中的user_name替换为adminuser.txt中相应的user_id。我使用的linux bash脚本如下:

filename="temp.txt"
input="adminuser.txt"
while IFS= read -r line
do
    echo $line > $filename
    user_id="$(cut -d ' ' -f 1 $filename)"
    user_name="$(cut -d ' ' -f 2 $filename)"
    sed -i "s/$user_name/$user_id/g" result.txt
done < "$input"

我想要的输出如下:表result.txt

48 1
48 2
50 3
bihw5rsg

bihw5rsg1#

您不需要在bash shell循环中嵌入外部工具/实用程序,如sedcut,类似于:

filename="temp.txt"
input="adminuser.txt"

while read -ru9 admin_id admin_user; do
  while read -r result_user result_id; do
    [[ "$admin_user" = "$result_user" ]] && {
      printf '%s %s\n' "$admin_id" "$result_id"
    }
  done < result.txt
done 9< "$input" > "$filename" && mv "$filename" result.txt
  • 当涉及到大/数据输入时,上述解决方案将非常非常慢。因此awk解决方案将是正确的方法。
t98cgbkg

t98cgbkg2#

awk 'NR==FNR{a[$2]=$1}NR!=FNR{$1=a[$1];print}' adminuser.txt result.txt > result.txt.tmp && mv result.txt.tmp result.txt

可证明的成功:

$ cat adminuser.txt 
48  yimenju
50  dolwdow
$ cat result.txt 
yimenju 1
yimenju 2
dolwdow 3
$ awk 'NR==FNR{a[$2]=$1}NR!=FNR{$1=a[$1];print}' adminuser.txt result.txt > result.txt.tmp && mv result.txt.tmp result.txt 
$ cat result.txt 
48 1
48 2
50 3
$

相关问题