说,我有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
则将输出文本文件多次输入或重复输入。
我想知道我应该在哪里更改以摆脱这些问题。谢谢你的建议!
答案 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
以避免处理文件的其余部分。