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