将awk模式应用于具有相同名称的所有文件,将每个文件输出到新文件

时间:2018-03-05 00:40:44

标签: bash awk

我正在尝试以递归方式查找目录中具有相同名称的所有文件,对它们应用awk模式,然后输出到每个文件都存在该文件的新更新版本的目录。

我认为使用for循环比使用xargs更好,但我不知道如何使这个工作...

对于f in $(find。-name FILENAME.txt); do awk -F“\(corr \)”'{print $ 1,$ 2,$ 3,$ 4}'./ FINILAME.txt> ./newFILENAME.txt $ f; 完成

最终我希望能够使用-F一次性从文件中删除多个字符串,但也不确定如何使用awk执行此操作。

还有一种方法可以删除“(cor *)”,其中*表示通配符吗?不确定如何保持括号的转义序列

谢谢!

1 个答案:

答案 0 :(得分:1)

要使用(corr*)作为字段分隔符,其中*是一个glob样式的通配符,请尝试:

awk -F'[(]corr[^)]*[)]' '{print $1,$2,$3,$4}'

例如:

$ echo '1(corr)2(corrTwo)3(corrThree)4' | awk -F'[(]corr[^)]*[)]' '{print $1,$2,$3,$4}'
1 2 3 4

要将此命令应用于名为FILENAME.txt的当前目录下的每个文件,请使用:

find . -name FILENAME.txt -execdir sh -c 'awk -F'\''[(]corr[^)]*[)]'\'' '\''{print $1,$2,$3,$4}'\'' "$1" > ./newFILENAME.txt' Awk {} \;

注释

不要使用:

for f in $(find . -name FILENAME.txt ); do

如果任何文件或目录中包含空格或其他shell-active字符,结果将是一个令人不快的惊喜。

将parens和方括号都作为字段分隔符处理

考虑这个测试文件:

$ cat file.txt
1(corr)2(corrTwo)3[some]4

要消除这两种类型的分隔符并打印前四列:

$ awk -F'[(]corr[^)]*[)]|[[][^]]*[]]' '{print $1,$2,$3,$4}' file.txt
1 2 3 4