for循环覆盖或条目重复

时间:2019-07-12 10:12:09

标签: shell awk

说,我有250个文件,我需要从中提取某些信息并将其存储在文本文件中。 我已经尝试过在shell中进行如下循环,

mutate

使用library(tidyverse) library(rlang) unite_fun <- function(df, var1 = mpg, var2 = cyl, col_name = hello){ var1 <- enquo(var1) var2 <- enquo(var2) col_name <- enquo(col_name) col1_name <- quo_name(col_name) mtcars %>% as_tibble() %>% select(!!var1 , !!var2) %>% mutate_all(as.character) %>% unite(col = !!col_name, sep = "/") %>% mutate(!!col1_name := str_replace(!!col_name, "/", "")) } unite_fun(mtcars, mpg, cyl) # A tibble: 32 x 1 # hello # <chr> # 1 216 # 2 216 # 3 22.84 # 4 21.46 # 5 18.78 # 6 18.16 # 7 14.38 # 8 24.44 # 9 22.84 #10 19.26 # … with 22 more rows 运算符将覆盖输出文本文件,而使用text= 'home/path/tothe/textfiles' for sam in $(find ${text} -name \*_PG.tsv);do #echo ${sam} awk '{if($2=="ID") print FILENAME"\t""yes""\t""SAP""\t""LUFTA"}' ${sam} done >> ${text}/metadata.txt 则将输出文本文件多次输入或重复输入。

我想知道我应该在哪里更改以摆脱这些问题。谢谢你的建议!

1 个答案:

答案 0 :(得分:3)

我认为您可以通过一次调用awk来做到这一点:

path=home/path/tothe/textfiles
awk -v OFS='\t' '$2 == "ID" { 
  print FILENAME, "yes", "SAP", "LUFTA" 
}' "$path"/*_PG.tsv > "$path"/metadata.txt
  • 注意您的变量分配,=
  • 周围不应有空格
  • 使用外壳扩展文件列表,而无需使用find
  • 将文件的完整列表作为参数传递给awk,而不是一个一个地循环
  • 设置输出字段分隔符OFS而不是编写\t分隔字段
  • 将输出重定向到元数据文件

我假设您的awk脚本行为符合您的预期-由于awk脚本的编写方式类似于if,因此我删除了无用的condition { action }。我猜您每个文件只需要一行输出,因此您可以在块内添加exit以避免处理文件的其余部分。