bash 脚本比较两个文件的字段并替换列

mas*_*deh 3 text command-line bash scripts text-processing

我有两个文件。

文件A:

newname,1,string
newname,2,string
newname,3,string
...
name,65500,string
Run Code Online (Sandbox Code Playgroud)

文件B;

oldname,1,string
oldname,2,string
oldname,3,string
...
oldname,65500,string
Run Code Online (Sandbox Code Playgroud)

我需要一个 bash 脚本来将文件 B 中的“旧名称”更改为文件 A 中的“新名称”,其中第二列号匹配。

Raf*_*ffa 7

假设 file 中没有重复的第二个字段A,则awk

awk -F',' 'BEGIN{OFS=FS} NR==FNR{a[$2]=$1; next} ($2 in a ){$1=a[$2]}1' A B
Run Code Online (Sandbox Code Playgroud)

解释:

  • -F','将字段分隔符设置为逗号,以正确读取逗号分隔的字段。

  • BEGIN{OFS=FS}将输出字段分隔符设置OFS为当前字段分隔符FS以用于输出/结果打印目的...一个BEGIN块将在 AWK 脚本的其余部分之前首先执行。

  • NR==FNR{a[$2]=$1; next}是一个条件NR==FNR,只要正在处理的文件是两个文件中的第一个文件A,并且B按照它们作为参数传递给 AWK 脚本的顺序,在上面的情况下,该脚本是 file A... 和一个操作{a[$2]=$1; next}wherea[$2]=$1会将每行中的第一个字段读$1入数组中的数组元素,并通过同一行中a第二个字段的值对其进行索引...并且当条件不再为真时将跳到下一个块,即它将保持只要当前块的条件评估为真,就处理当前块,否则将跳过该块。$2next

  • ($2 in a ){$1=a[$2]}1现在正在处理第二个文件,即在具有条件的数组索引中查找每行中的B第二个字段,如果其计算结果为 true,则意味着当前行中第二个字段的值在两个文件中相等,然后该操作将用数组中刚刚在数组中找到的索引的元素替换当前行中的第一个字段,并且将始终评估为 true ,这将打印该行中的所有行(已修改和未修改)当前正在处理的文件即文件。$2a($2 in a )$1=a[$2]$1aa1B