我有两个文件。
文件 A:
newname,1,string
newname,2,string
newname,3,string
...
name,65500,string
文件 B;
oldname,1,string
oldname,2,string
oldname,3,string
...
oldname,65500,string
我需要一个 bash 脚本来将文件 B 中的“oldname”更改为文件 A 中的“newname”,并使它们的第二列号匹配。
答案1
假设文件中没有重复的第二个字段A
,则awk
:
awk -F',' 'BEGIN{OFS=FS} NR==FNR{a[$2]=$1; next} ($2 in a ){$1=a[$2]}1' A B
解释:
-F','
将字段分隔符设置为逗号,,
以便正确读取逗号分隔的字段。BEGIN{OFS=FS}
将把输出字段分隔符设置OFS
为当前字段分隔符FS
,以便输出/结果打印目的...BEGIN
块将在 AWK 脚本的其余部分之前首先执行。NR==FNR{a[$2]=$1; next}
是一个条件,NR==FNR
只要正在处理的文件是两个文件中的第一个文件A
,并且B
按照它们作为参数传递给 AWK 脚本的顺序(在上面的例子中是文件),它就会被评估为 trueA
...还有一个操作{a[$2]=$1; next}
,a[$2]=$1
将读入每行的第一个字段$1
到数组中的数组元素中,并通过同一行中a
第二个字段的值对其进行索引...当条件不再为真时,将跳到下一个块,即,只要其条件评估为真,它就会继续处理当前块,否则将跳过该块。$2
next
($2 in a ){$1=a[$2]}1
现在正在处理第二个文件,即,根据条件在数组的索引中查找每行中的B
第二个字段,如果结果为真,即两个文件中当前行第二个字段的值相等,则操作将用数组中刚刚在数组中找到的元素替换当前行中的第一个字段,并且结果始终为真,这将打印所有行($2
a
($2 in a )
$1=a[$2]
$1
a
a
1
已修改和未修改) 在当前正在处理的文件中,即文件B
。
答案2
Unix 方式使用一些基本实用程序:
join -t, -1 2 -2 2 -o 1.1,1.2,2.3 <(sort -t, -k2,2 A) <(sort -t, -k2,2 B)
也可以看看:
- 男人排序
- 男子加入
- man bash (用于
<()
构造)