我正在尝试以递归方式查找目录中具有相同名称的所有文件,对它们应用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 *)”,其中*表示通配符吗?不确定如何保持括号的转义序列
谢谢!
答案 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字符,结果将是一个令人不快的惊喜。
考虑这个测试文件:
$ cat file.txt
1(corr)2(corrTwo)3[some]4
要消除这两种类型的分隔符并打印前四列:
$ awk -F'[(]corr[^)]*[)]|[[][^]]*[]]' '{print $1,$2,$3,$4}' file.txt
1 2 3 4