Bash 通过获取特定编号来移动记录';s前缀

Bash 通过获取特定编号来移动记录';s前缀,bash,unix,awk,sed,grep,Bash,Unix,Awk,Sed,Grep,我想在bash中将一些记录分离到另一个文件中 我有两个文件,一个包含文件A中的所有记录,另一个包含文件A中包含的数字的可能前缀(文件B) 使用下面文件A和B的值,我想从文件A中移动包含前缀的记录。请注意,我必须只比较文件A的第11位和第19位。 为了进一步理解我的查询,请参考下面的输出 多谢各位 $cat FILE_A xxxxxxxxxx234575234xxxx01234 xxxxxxxxxx755602188xxxx02345 xxxxxxxxxx044664690xxxx0456

我想在bash中将一些记录分离到另一个文件中

我有两个文件,一个包含文件A中的所有记录,另一个包含文件A中包含的数字的可能前缀(文件B)

使用下面文件A和B的值,我想从文件A中移动包含前缀的记录。请注意,我必须只比较文件A的第11位和第19位。 为了进一步理解我的查询,请参考下面的输出

多谢各位

 $cat FILE_A
 xxxxxxxxxx234575234xxxx01234
 xxxxxxxxxx755602188xxxx02345
 xxxxxxxxxx044664690xxxx04567
 xxxxxxxxxx044663581xxxx01234
 xxxxxxxxxx082550123xxxx08234

 note: num=11th to 19th digit
包含num_前缀的文件

 $cat FILE_B
 04466358
 0446646
 02345
 08234

 note: num_prefix=all the values above
输出:

 cat new_generated_file
 xxxxxxxxxx234575234xxxx01234
 xxxxxxxxxx044664690xxxx04567
 xxxxxxxxxx044663581xxxx01234
重要的是,脚本只能比较文件A和文件B的第11-19位数字,因为最后5位数字可能会影响输出

像这个:

 $ sed 's/^0//' File_B > File_C; grep -f File_C File_A
给我这个输出

 xxxxxxxxxx234575234xxxx01234
 xxxxxxxxxx755602188xxxx02345
 xxxxxxxxxx044664690xxxx04567
 xxxxxxxxxx044663581xxxx01234
 xxxxxxxxxx082550123xxxx08234
(xxxxxxxxx 755602188xxx02345和xxxxxxxxx 082550123xxxx08234不应该在那里) 因为08234 02345(最后5位)都在文件C中,所以您可以使用:

grep -f <(sed 's/^0//' fileB) fileA
xxxxxxxxxx234575234xxxxx
xxxxxxxxxx044664690xxxxx
xxxxxxxxxx044663581xxxxx
xxxxxxxxxx082340123xxxxx
  • 也应该适用于bash(没有保留在bash中的第一行)
  • 它使用(e)grep正则表达式作为选择器,以避免对周围内容的干扰
  • 假设文件A总是以10个字符开始(任何打印字符)
  • 调整以允许文件A中以0开头的数字包含oy而不包含oy
  • posix sed兼容,因此在GNU sed上使用
    --posix
    选项

x
ar是否也是数字?XXXXXXXX 99234599XXXX是否也可以省略02345前缀(假设不是,pre_fix意味着开始我猜)?为什么它会给我一个像^.{10}468664这样的输出到fileB?这是一个egrep使用的正则表达式告诉:选择任何10个第一个字符后跟468664的行。因此,
abcdefghij468664blabla'是通过Egrepha获得的,而不是'ab468664ij999999blabla
您已经尝试过了吗?我运行了脚本,但没有为文件B中的起始0调整outputpost(有时存在,有时不存在),还删除了文件B中的空行情况,它将报告所有行。是否有其他方法加快此过程?因为处理大型记录似乎太慢了。感谢输出仅为
234575234
而不是整行
xxxxxxxxxxxxx 23457523xx01234
输出仅为
234575234
而不是整行
xxxxxxxxx 23457523xx01234
sed 's/^0//' fileB > fileC
while read -r f; do
    `echo "$f" | cut -c 11-19 | grep -qf fileC` && echo "$f"
done < fileA
sed 's/^0//' fileB > fileC
cut -c 11-19 fileA | grep -f fileC > fileD
grep -F -f fileD fileA
#!/bin/ksh
sed -n '/^*$/ !{s/^0\{1,\}/0*/;s/^/^.{10}/;p;}' fileB > /tmp/CleanPrefix.egrep
egrep -f /tmp/CleanPrefix.egrep fileA
rm /tmp/CleanPrefix.egrep