匹配文件中的模式之间的行,并检查匹配行中的单词,如果未找到,则添加单词

分享于 

4分钟阅读

ubuntu

  繁體

问题:

我有一个大文件,内容如下:

--- fruits_file.txt---


fruit:



apple 


orange



fruit:



grapes


mango



fruit:



banana


cherries



--- fruits_file.txt---


fruit:



apple



orange



fruit:



grapes



mango



apple



fruit:



banana



cherries



apple



有没有简单的方法来实现这个?


答案1:

可以通过以下方式处理文件:

0.假定你的文件如下所示:


cat fruits_file.txt




fruit:



apple


orange



fruit:



grapes


mango



fruit:



banana


cherries



1.将文件的内容转换为单行:


paste -s -d ' ' fruits_file.txt




fruit: apple orange fruit: grapes mango fruit: banana cherries



2.将上面的命令的输出通过管道传递给sed,并在字符串fruit:之前放置新行,通过管道将输出传递给|


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d'




fruit: apple orange


fruit: grapes mango


fruit: banana cherries



3.将上面的命令的输出通过管道传递给awk,以便将apple附加到缺少该命令的行:


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}'




fruit: apple orange


fruit: grapes mango


fruit: banana cherries



4.将上面的命令的输出通过管道传递给sed,以便将(表达式1)多个空格替换为单个空格,而(表达式2)在每个空格后面追加


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}' | 


 sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /'




fruit: apple orange


fruit: grapes mango apple


fruit: banana cherries apple



5.再次将上面的命令的输出通过管道传递给sed,以便用换行符替换,然后通过管道将输出传递给head,以便删除最后两行空行:


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}' | 


 sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /' | 


 sed -e 's/s/n/g' -e 's/fruit:/fruit:n/' | head -n -2




fruit:



apple


orange



fruit:



grapes


mango


apple



fruit:



banana


cherries


apple



6.重定向上述命令的输出,并创建一个新文件:


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}' | 


 sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /' | 


 sed -e 's/s/n/g' -e 's/fruit:/fruit:n/' | head -n -2 


 > fruits_new.txt



 
cat fruits_new.txt




fruit:



apple


orange



fruit:



grapes


mango


apple



fruit:



banana


cherries


apple





文件  添加  WORD  MAT  pattern