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

Bash 将awk模式应用于具有相同名称的所有文件,并将每个文件输出到新文件,bash,awk,Bash,Awk,我试图递归地在一个目录中找到所有同名的文件,对它们应用awk模式,然后向每个文件所在的目录输出文件的新更新版本 我认为使用for循环比使用xargs更好,但我不知道如何使它工作 对于f,单位为$(find.-name FILENAME.txt); 执行awk-F“\(corr\)”{print$1,$2,$3,$4}./FILENAME.txt>/newFILENAME.txt$F; 完成 最终,我希望能够使用-F一次从文件中删除多个字符串,但也不确定如何使用awk 还有一种方法可以删除“*”中

我试图递归地在一个目录中找到所有同名的文件,对它们应用awk模式,然后向每个文件所在的目录输出文件的新更新版本

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

对于f,单位为$(find.-name FILENAME.txt); 执行awk-F“\(corr\)”{print$1,$2,$3,$4}./FILENAME.txt>/newFILENAME.txt$F; 完成

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

还有一种方法可以删除“*”中的“*”表示通配符吗?不知道在保持括号的转义序列的同时如何做

谢谢

要使用
(corr*)
作为字段分隔符,其中
*
是全局式通配符,请尝试:

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活动字符,结果将令人不快

将括号和方括号作为字段分隔符处理 考虑以下测试文件:

$ cat file.txt
1(corr)2(corrTwo)3[some]4
要消除这两种类型的分隔符并打印前四列,请执行以下操作:

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

非常感谢。非常感谢!如果我想使用awk删除多个字符串,我会使用&?不客气,“如果我想删除多个字符串…”这是什么意思?用这些“多个字符串”显示示例输入和相应的输出。就像我删除了表单(corr*)中的所有内容一样,我也希望删除表单[*]中的所有内容。因此,输入为0.001998002(校正)0.8450 0.0870 0.1550 0.000999001(校正)[PM SEM last>EM SEM],输出为numbers@Ducki有关处理这两种类型的分隔符的方法,请参见更新的答案。