Bash 使用sed awk替换另一个文件中定义的变量
我有一个users.txt文件,格式如下: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}
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=“:”}
:
:我们读取城市文件并创建一个数组来存储城市ID索引的城市名称NR==FNR{a[$2]=$1;next}
:我们通过引用数组替换user.txt中的第二个字段{$2=a[$2]}
:用于打印行1
awk 'BEGIN{FS=OFS=":"}NR==FNR{a[$2]=$1;next}{$2=a[$2]}1' city.txt user.txt
:我们将输入和输出字段分隔符设置为BEGIN{FS=OFS=“:”}
:
:我们读取城市文件并创建一个数组来存储城市ID索引的城市名称NR==FNR{a[$2]=$1;next}
:我们通过引用数组替换user.txt中的第二个字段{$2=a[$2]}
:用于打印行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%