我已经搜索并帮助了我的方式,但现在我被卡住了。 基本上我有一个像这样的文本文件:
"02/01/2018 08:34:15"|"02/01/2018 08:34:16"|"Completed"|"70000000000006632150"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"**580**"|"1600"||"355672079017"||"1600"|"590279"|"588679"|7|101369|102577|-1|200158
"02/01/2018 08:34:03"|"02/01/2018 08:34:04"|"Completed"|"70000000000006632146"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"**601**"|"1100"||"355696369862"||"1106"|"591379"|"590279"|7|101369|102577|-1|200158
"02/01/2018 08:33:17"|"02/01/2018 08:33:18"|"Completed"|"70000000000006632123"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"**319**"|"1100"||"355694523968"||"1103"|"592479"|"591379"|7|101369|102577|-1|200158
我想用一个与代码匹配的名称替换粗体值。我已经创建了一个这样的查找文件
"319"|"AS003"
"601"|"Z 477"
"580"|"Z 478"
"101"|"AS006"
我使用awk搜索第一个文件,从第2个文件中找到相应的值,替换它并将所有内容写入新文件。 一切都适用于319和101但不适用于其他人,我怀疑这是由于Z和代码之间的空间。 在我正在使用的代码下面:
tail -n +2 file_name | while read line ####used tail _n +2 to exclude header
do
code=$(echo $line | awk -F'|' '{print $12}' FS=\|)
cn=$(awk -v CID=$code '$1==CID {print $2}' FS=\| lookup_file)
echo $line|awk -v CN=$cn 'BEGIN {FS=OFS="|"} {$12=CN} 1' >> test2.txt
done
对于查找文件中有空格的行,我在终端中收到此错误:
awk: code_value"
awk: ^ unterminated string
并且它没有写在输出文件
中任何建议都会受到欢迎......
答案 0 :(得分:2)
awk
可以做到这一切。使用awk引用文件可能会很痛苦,但我认为这并不重要。
$ cat file.txt
"02/01/2018 08:34:15"|"02/01/2018 08:34:16"|"Completed"|"70000000000006632150"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"580"|"1600"||"355672079017"||"1600"|"590279"|"588679"|7|101369|102577|-1|200158
"02/01/2018 08:34:03"|"02/01/2018 08:34:04"|"Completed"|"70000000000006632146"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"601"|"1100"||"355696369862"||"1106"|"591379"|"590279"|7|101369|102577|-1|200158
"02/01/2018 08:33:17"|"02/01/2018 08:33:18"|"Completed"|"70000000000006632123"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"319"|"1100"||"355694523968"||"1103"|"592479"|"591379"|7|101369|102577|-1|200158
$ cat map.txt
"319"|"AS003"
"601"|"Z 477"
"580"|"Z 478"
"101"|"AS006"
$ awk 'BEGIN{FS=OFS="|"} FNR==NR{map[$1]=$2;next} {$12=map[$12]; print}' map.txt file.txt
"02/01/2018 08:34:15"|"02/01/2018 08:34:16"|"Completed"|"70000000000006632150"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"Z 478"|"1600"||"355672079017"||"1600"|"590279"|"588679"|7|101369|102577|-1|200158
"02/01/2018 08:34:03"|"02/01/2018 08:34:04"|"Completed"|"70000000000006632146"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"Z 477"|"1100"||"355696369862"||"1106"|"591379"|"590279"|7|101369|102577|-1|200158
"02/01/2018 08:33:17"|"02/01/2018 08:33:18"|"Completed"|"70000000000006632123"|"Activation"||"22200995102577"|"External System"|"ALFUNC ASBS"|"ASBS Shpk"|"VF Shop Asbs 1_209"|"AS003"|"1100"||"355694523968"||"1103"|"592479"|"591379"|7|101369|102577|-1|200158
awk代码首先将OFS设置为|因为我们正在更改字段,然后对于第一个文件,由总行读取等于当前文件行确定,我们构建第一个到第二个字段的映射,然后在第二个文件中我们从该映射中查找值。 / p>
编辑: 如评论中所述,如果未使用
进行映射,我的代码将为空$12
awk 'BEGIN{FS=OFS="|"} FNR==NR{map[$1]=$2;next} {$12=($12 in map ? map[$12] : $12); print}' map.txt file.txt
而是将值保留在原位。