awk和sed命令同时执行

时间:2015-12-26 11:15:34

标签: linux bash awk sed

我有2个文件,英文文件(源文件)和意大利文件(目标文件)。它们都具有相同行数。我运行awk 'NF<3'删除我的意大利文件中超过2个单词的所有字符串,但同时我想删除从英文文件中的意大利文件中删除的特定源字符串(我以为我可以在线号上工作)。当然,我必须对源字符串的行号执行sed命令(导致两个文件中的字符串不同),但我不知道如何在我使用时同时执行此操作awk从意大利文件中删除这些字符串,因为当我启动命令时,我丢失了文件中的等效行号。

实施例

EN
1 Santa Claus
2 Pigs don't fly
3 The son of the father
4 Elf

IT
1 Babbo Natale
2 I maiali non volano
3 Il figlio del padre
4 Elfo

I run awk on IT file
OUTPUT FILE
IT
1 Babbo Natale
4 Elfo

IT文件中用awk删除的行也需要从EN文件中删除(我不能再在aw文件上使用awk,因为eng文件上的字数是与IT文件不同,它只是一个行号工作)

THE OUTPUT EN FILE MUST BE
1 Santa Claus
2 Elf

有什么建议吗? 如果不清楚,请询问......

2 个答案:

答案 0 :(得分:4)

拥有文件:

$ cat it.dat 
Babbo Natale
I maiali non volano
Il figlio del padre
Elfo

$ cat en.dat 
Santa Claus
Pigs don't fly
The son of the father
Elf

awk

awk 'NR==FNR{if(NF>3){a[NR]}else{a[NR]=1;print > "filtered_it.dat"}}
     NR!=FNR && a[FNR]{print > "filtered_en.dat"}' it.dat en.dat 

<强>结果

$ cat filtered_id.dat 
Babbo Natale
Elfo
$ cat filtered_en.dat 
Santa Claus
Elf

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -rn 's/\S+//3;T;=' fileIT | sed 's/.*/&d/' | sed -f - fileEN

这使用IT文件创建一个针对EN文件运行的sed文件。第一个sed调用输出IT文件中一行中有三个或更多单词的任何行的行号。第二个sed调用将行号转换为sed命令以删除该行号。第三个sed调用从EN文件中删除这些行号。