Bash 使用sed awk替换另一个文件中定义的变量

Bash 使用sed awk替换另一个文件中定义的变量,bash,sed,awk,Bash,Sed,Awk,我有一个users.txt文件,格式如下: User:CityID Carl:0212 Syd:0312 Rick:9323 以及格式为的city.txt文件 Anaheim:0212 San Jose:0312 我需要用city.txt文件中的城市名称替换users.txt中的每个CityID。 如何使用sed和awk实现这一点 我可以使用awk获得CityID的列,使用: awk -F$'\:' '{print $2}'< users.txt awk-F$\:'{print$2}

我有一个users.txt文件,格式如下:

User:CityID
Carl:0212
Syd:0312
Rick:9323
以及格式为的city.txt文件

Anaheim:0212
San Jose:0312
我需要用city.txt文件中的城市名称替换users.txt中的每个CityID。 如何使用sed和awk实现这一点

我可以使用awk获得CityID的列,使用:

awk -F$'\:' '{print $2}'< users.txt
awk-F$\:'{print$2}'
但它如何用相应的城市名称替换它们呢

谢谢。

这将有效:

awk 'BEGIN{FS=OFS=":"}NR==FNR{a[$2]=$1;next}{$2=a[$2]}1' city.txt user.txt
  • BEGIN{FS=OFS=“:”}
    :我们将输入和输出字段分隔符设置为

  • NR==FNR{a[$2]=$1;next}
    :我们读取城市文件并创建一个数组来存储城市ID索引的城市名称

  • {$2=a[$2]}
    :我们通过引用数组替换user.txt中的第二个字段

  • 1
    :用于打印行

这将起作用:

awk 'BEGIN{FS=OFS=":"}NR==FNR{a[$2]=$1;next}{$2=a[$2]}1' city.txt user.txt
  • BEGIN{FS=OFS=“:”}
    :我们将输入和输出字段分隔符设置为

  • NR==FNR{a[$2]=$1;next}
    :我们读取城市文件并创建一个数组来存储城市ID索引的城市名称

  • {$2=a[$2]}
    :我们通过引用数组替换user.txt中的第二个字段

  • 1
    :用于打印行


您可以使用
sed
city.txt
转换为
sed
脚本:

sed 's/\([^:]*\):\(.*\)/s%\2%\1%g/' city.txt
然后将其馈送到第二个
sed
实例以处理
users.txt

sed 's/\([^:]*\):\(.*\)/s%\2%\1%g/' city.txt |
sed -f - users.txt

并非所有的
sed
变体都会接受标准输入的脚本文件;在这种情况下,您必须使用临时文件。

您可以使用
sed
city.txt
转换为
sed
脚本:

sed 's/\([^:]*\):\(.*\)/s%\2%\1%g/' city.txt
然后将其馈送到第二个
sed
实例以处理
users.txt

sed 's/\([^:]*\):\(.*\)/s%\2%\1%g/' city.txt |
sed -f - users.txt

并非所有的
sed
变体都会接受标准输入的脚本文件;在这种情况下,您必须求助于临时文件。

Genius!非常感谢你!这正是我要找的福格尼尔斯!非常感谢你!这正是我在寻找的,当您从文件
awk'…'
重定向输入时,您将失去awk填充通常有用的
FILENAME
变量的能力。只需让awk打开文件本身
awk'…'文件
。当您从文件
awk'…'文件
重定向输入时,awk将无法填充通常有用的
文件名
变量。对于这种方法,只需让awk打开文件本身
awk'…'文件
+1,但可能有一个bug,无法识别某些ID,例如
0212
02120
可以使用单词或字段边界标记详细说明生成的脚本,但给定了示例数据(固定字段长度,前导零填充)那似乎没有必要。对于这种方法,一个快速而肮脏的修复程序将是
s%:\2$%:\1%
+1,但可能有一个bug,无法识别某些ID,例如
0212
02120
可以使用单词或字段边界标记详细说明生成的脚本,但给定了示例数据(固定字段长度,前导零填充)那似乎没有必要。快速而肮脏的修复程序是
s%:\2$%:\1%