两个文件:data1
Name |formula |no. |dose|days|cost |msg|em|notes
Fname-Lname|BXXXT+GG |8262|4 |14 |57.78 | | |sq
Fname-Lname|SJXXT+GG |8263|4¾ |14 |105.15| | |IB
Fname-Lname|FJDHT+BH,LG,CQC,ZX|8264|5¾ |14 |46.20 | | |IB
数据2
10/12/2020|more-data-3456|105.15
10/12/2020|more-data-3456|95.10
11/12/2020|more.data-3456|30.30
14/12/2020|more-data-3456|45.55
我正在使用代码片段
awk 'BEGIN {FS = "|" } NR==FNR{a[$6];next} $3 in a {print $0}' data1 data2
为了匹配文件 data1 的 $6 中的值也出现在文件 data2 的 $3 中的位置。如果有匹配项,则打印出包含文件 data2 中匹配项的整个记录 ($0)。我期待:
10/12/2020|more-data-3456|105.15
但我只得到一个空行的输出。"|"
我使用替换命令删除了文件分隔符" "
,命令代码完全按预期工作,但我真的希望尽可能保留字段分隔符|
。我想了解为什么添加 BEGIN 块会导致这种情况。它是否导致 awk 加载一个空数组而不是从 S6 获取数据?我的 awk 水平略高于初学者。编辑:我还使用了具有相同结果的 -F 参数,即空行的输出。我正在使用 gawk 。
您的代码适用于我,适用于 GNU awk 5.1.0 和 macOS awk 20200816。
您使用的是哪个版本的 awk?
请注意,您还可以使用
-F
命令行参数设置字段分隔符;如果你这样做,那么该BEGIN
块是不必要的。sub()
下面我的脚本中)。105.15
但CR
最后是覆盖回到行首 - 管道输出| cat -v
以查看是否属实。|
因此您应该设置FS
为匹配 -FS=" *[|] *"
{print $0}
,因为这是默认行为尝试这个: