2017-06-14 41 views
0

让我们假设我们有一个这样的字符串:如果条件不匹配,awk删除行并复制到日志文件?

383;06;55.270989;144991494994851A5485AA54J7HH337H3H33HT570BBG7BBGBT07BT7R55U155U5IR75I79QQ9SQQ9Q597Q57S229122928S4284;N 

但下文件,我们会遇到这样的事情:

383;06;55.270989;||<FD><F0>p|/x|<A9>|<E2>|,|<F7>|l|[email protected]<F5>q|I|b%<EB><AB><C2>l|F|<D7>%|<C0><E4>wy||z<BE>|;|b<E5>&x"h<D1>e|j|E|c|<F4><E1> 
<C2>4^|Q|<EF>H|<E0>2t<C2>6'<E4><C7>||Z|<E0>q|9d|;N 

是否有一种方式来运行这一点,并说,如果txt文件不有x个字段(分隔符;)或将其从文件中删除并将其放在日志文件中?

编辑:该方法还包括具有日志正被用于以后的分析取出

+0

如果决定是基于字段数,'awk'是不错的选择..如果你只是想跳过基于线字符,说''''或'<''那么你可以使用'grep' ...无论哪种方式,给它一个镜头......大量的重复 – Sundeep

+0

决定基于字段的数量,但我还没有想法从哪里开始:( – jycr753

+2

https://www.gnu.org/software/gawk/manual/gawk.html是最好的开始...使用https://www.gnu.org/software/gawk/manual /gawk.html#Patterns-and-Actions和https://www.gnu.org/software/gawk/manual/gawk.html#Field-Separators – Sundeep

回答

2

输出两个文件,你可以重定向打印报表要删除线的情况下的数据。写行,你要保持一个tmp文件,并复制回您的输入:

$ cat input 
383;06;55.270989;144991494994851A5485AA54J7HH337H3H33HT570BBG7BBGBT07BT7R55U155U5IR75I79QQ9SQQ9Q597Q57S229122928S4284;N 
383;06;55.270989;||<FD><F0>p|/x|<A9>|<E2>|,|<F7>|l|[email protected]<F5>q|I|b%<EB><AB><C2>l|F|<D7>%|<C0><E4>wy||z<BE>|;|b<E5>&x"h<D1>e|j|E|c|<F4><E1><C2>4^|Q|<EF>H|<E0>2t<C2>6'<E4><C7>||Z|<E0>q|9d|;N 

$ awk -F\; 'NF != 5 { print > "logfile.log"; next }1' input > tmp; mv tmp input 

$ cat logfile.log 
383;06;55.270989;||<FD><F0>p|/x|<A9>|<E2>|,|<F7>|l|[email protected]<F5>q|I|b%<EB><AB><C2>l|F|<D7>%|<C0><E4>wy||z<BE>|;|b<E5>&x"h<D1>e|j|E|c|<F4><E1><C2>4^|Q|<EF>H|<E0>2t<C2>6'<E4><C7>||Z|<E0>q|9d|;N 

$ cat input 
383;06;55.270989;144991494994851A5485AA54J7HH337H3H33HT570BBG7BBGBT07BT7R55U155U5IR75I79QQ9SQQ9Q597Q57S229122928S4284;N 
+0

我一直noob这种类型的命令,我该怎么办,当所有这些行都在一个文件内? – jycr753

+1

在我的示例中,原始行的文件名称是“输入”。只需将其替换为文件的真实名称(在它出现的两个地方)。您可能还想用更有意义的名称替换“logfile.log”。请小心,在运行命令后,您将替换原始文件!确保你保留副本:-) – jas

+0

真棒感谢队友 – jycr753