【问题标题】:Applying awk pattern to all files with same name, outputting each to a new file将 awk 模式应用于所有具有相同名称的文件,并将每个文件输出到一个新文件
【发布时间】:2018-03-05 12:11:51
【问题描述】:

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

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

for f in $(find .-name FILENAME.txt); 执行 awk -F"\(corr\)" '{print $1,$2,$3,$4}' ./FILENAME.txt > ./newFILENAME.txt $f; 完成

最终我希望能够使用 -F 一次从文件中删除多个字符串,但也不知道如何使用 awk 来做到这一点。

还有一种方法可以删除 * 代表通配符的“(cor*)”吗?在保持括号的转义序列的同时不知道该怎么做

谢谢!

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    要将(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] 输出只是数字
    • @Ducki 查看更新的答案,了解处理这两种分隔符的方法。
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2023-02-10
    • 1970-01-01
    • 2019-05-24
    • 2018-10-25
    相关资源
    最近更新 更多