【问题标题】:How do I find files to edit and export to the same directory as a different file using Awk and Find in a for loop如何在 for 循环中使用 Awk 和 Find 查找要编辑的文件并将其导出到与不同文件相同的目录
【发布时间】:2019-03-18 15:27:47
【问题描述】:

一个愚蠢的问题要问,但我似乎无法通过 stackoverflow 或其他谷歌搜索结果找到答案。这个问题要么太具体,要么太愚蠢。我觉得是后者……

我正在使用awk过滤不同子目录下的文件,我想在文件所在的同一子目录下输出结果。

我正在使用 find 命令,并且能够awk 匹配该模式的所有子目录中的文件。

find 文件以 .tsv 结尾,然后 awk 第 8 列(-1 下的值),然后我使用文件名的基数输出文件并添加 .txt

for file in $(find $DIR2 -type f -name '*.tsv'); do
awk -F$'\t' '$8 < -1' $(find $DIR2 -type f -name '*.tsv') > $DIR2/$(basename ${file%.*}).txt; done

但是,我有点卡住了,不知道如何输出原始子目录下的文件。

如果我使用$DIR2/,它只会在这个特定目录下导出,而没有$DIR2/,它会被导出到当前工作目录。

【问题讨论】:

标签: for-loop awk find subdirectory


【解决方案1】:

试试这个(未经测试):

find "$DIR2" -type f -name '*.tsv' -exec \
awk -F'\t' 'FNR==1{close(out); out=FILENAME; sub(/[^.]+$/,"txt",out)} $8 < -1{print > out}' {} +

如果您的find 不支持+,则将其替换为\;

【讨论】:

  • 谢谢 - 我已将其更正为目录。我现在要测试你的代码!
  • 它在我的测试目录中运行良好!谢谢你。您能否扩展并解释一下代码的含义,以便我可以从中学习并在将来使用它?谢谢你。尤其是“close(out)”和“{} +”部分。
  • 我真的很喜欢你的建议,因为它不涉及 for 循环。
  • 不客气。我真的认为代码的作用很明显。您是否尝试在 awk 手册页中查找 close() 并在查找中查找 {} +close(out) 正在关闭我们刚刚完成写入的文件,{} + 表示find 正在批量传递给awk 的文件列表。
  • 感谢您向我指出用于封闭 {} 的 close() 和 awk 语法 - 我现在正在查看它们。再次感谢!
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2019-12-27
相关资源
最近更新 更多