猛砸如何删除与源达匹配的17管目标文件记录
我的源文件是一个管道分隔一个猛砸如何删除与源达匹配的17管目标文件记录
QWER|RTYUI||12345678|09/07/1994|DFGHJK||PHOENIX|AZ||85044|123456|QQ|4567890|10/06/2017|12/31/9999|N||1|1234567|QQ|4567890876
,所以是我的目标文件(目标文件将在日期分区的文件夹)
QWER|RTYUI||12345678|09/07/1994|DFGHJK||PHOENIX|AZ||85044|123456|QQ|4567890|10/06/2017|12/31/9999|N|QQQ|NOMATCH
我应该能够挑选从源文件和循环记录通过所有文件的目标文件夹,从目标文件删除的记录,要注意的一点是,我只需要匹配数据高达17管在这两个文件中,因为在那之后数据不匹配。
例
BEFORE:
源文件
QWER|RTYUI||12345678|09/07/1994|DFGHJK||PHOENIX|AZ||85044|123456|QQ|4567890|10/06/2017|12/31/9999|N||1|1234567|QQ|4567890876
目的地文件
QWER|RTYUI||12345678|09/07/1994|DFGHJK||PHOENIX|AZ||85044|123456|QQ|4567890|10/06/2017|12/31/9999|N|QQQ|NOMATCH
QWER|RTYUI||98765432|09/07/1921|FGHJKJK||VBNM|AZ||85044|123456|QQ|4567890|10/06/2017|12/31/9999|N|QQQ|NOMATCH
AFTER:
目的地文件
QWER|RTYUI||98765432|09/07/1921|FGHJKJK||VBNM|AZ||85044|123456|QQ|4567890|10/06/2017|12/31/9999|N|QQQ|NOMATCH
第一条记录应该从目标文件中删除,因为它将数据与源文件一直到第17条管道相匹配。
以下awk应该能够帮助你。
awk -F"|" 'FNR==NR{a[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17];next} !(($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17) in a)' Source_file Destination_file > temp_file && mv temp_file Destination_file
现在也为解决方案添加非单行表单。
awk -F"|" '
FNR==NR{
a[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17];
next
}
!(($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17) in a)
' Source_file Destination_file > temp_file && mv temp_file Destination_file
用手写出所有17个字段看起来真的很单调...... – Aserre
壹切和一个grep的应该是足够
cut -d'|' -f1-17 source | grep -vFf- destination > new_destination
在这种情况下,一定要将'-F'加到'grep',否则输入行被解释为ERE模式,而不是固定字符串! (想象一条线包含'。*') – randomir
@pacholik,这一切都没有发生,我的源文件和目标文件保持不变 –
能否请您让我们知道,如果你的文件有任何特定的格式?通过查看你的输出,我可以看到你不想要的第17列,而不是从第17个字段中删除所有字段?你能不能让我们知道。 – RavinderSingh13
@ RavinderSingh13,更新了我的问题,请让我知道如果有帮助。 –
一个迟到的欢迎来到该网站!查看[tour](https://stackoverflow.com/tour)和[how-to-ask页面](https://stackoverflow.com/help/how-to-ask)以获取更多关于提问的信息会吸引高质量的答案。你可以[编辑你的问题](https://stackoverflow.com/posts/46667203/edit)来包含更多信息。你试过什么了?一般来说,我会使用'awk'来完成这类任务。 – cxw