如何测试File2的每一行中是否存在子字符串

我有两个文件,其中包含以下数据

文件1:

6100540301SD01        ON5330399520191104906781            2019110390678151053303995ACK          20191105
6100540301SD01        ON0403096420191104225695            2019110322569551004030964A            20191105
6005260301SD01        46460045792019110490678911059455    2019110490678951000755694BE3        1120191105
6005260301SD01        46460045792019110490679616020577    2019110490679651000764053BDJDEDH    1620191105

文件2:

20191104
20191105
20191106

由于 file1 是等宽文件,因此字符位置97到104的字符串是日期。我想从97到104的位置提取字符串,并检查 file2 中是否存在。如果存在,则要将整行复制到 file3 。如果不存在,则要将其复制到 file4

我已经创建了C ++程序,但是要处理 file1 花费了很长时间,而记录将近500万。因此,如果有任何awk/sed脚本可以提供帮助,请分享。

jixiang1986 回答:如何测试File2的每一行中是否存在子字符串

file2的内容转换为正则表达式,例如20191104|20191106|20191106。然后,您可以使用grep进行匹配。

patterns=$(<file2)
# Replace newlines with |
pattern=${patterns//$'\n'/|}
# Put ^.{96} at the beginning so it matches starting at column 97
pattern="^.{96}($pattern)"
grep -E "$pattern" file1 > file3 # Lines that match
grep -v -E "$pattern" file1 > file4 # Lines that don't match

如果两次运行grep太慢,则可以使用awk

awk -v pat="$pattern" '$0 ~ pat { print >>"file3"; next} {print >>"file4"}'
,

awk来营救!

$ awk 'NR==FNR {dates[$0]; next} 
               {print > (substr($0,97,104) in dates?"file3":"file4")}' file2 file1
,

这可能对您有用(GNU sed):

sed 's#.*#/^.\\{96\\}&/ba#' file2 | sed -nf - -e 'w file4' -e 'b;:a;w file3' file1

从file2创建一个脚本,该脚本将每个匹配项写入file3,并将其余所有行写入file4。

sed的第一次调用将其输出传递给sed的第二次调用,而第二次调用又由内联几串命令补充。所有匹配项都发送到循环持有者:a,该匹配项会将所有不匹配的内容都写到file3中,并落入文件4中。

本文链接:https://www.f2er.com/3141672.html

大家都在问