我有一个 csv 文件A.csv
(分隔符 : ,
):
sample,run
2071410189,RUN120
2071436273,RUN119
2071507844,RUN120
2071627356,RUN120
2071627370,RUN118
我想连接每个“样本”拥有的文件,为了做到这一点,我必须使用两个列信息来构造路径。每行的示例A.csv
home/RUN120_*/analyse/2071410189_*_*/*consensus.fasta
home/RUN119_*/analyse/2071436273_*_*/*consensus.fasta
home/RUN120_*/analyse/2071507844_*_*/*consensus.fasta
home/RUN120_*/analyse/2071627356_*_*/*consensus.fasta
home/RUN118_*/analyse/2071627370_*_*/*consensus.fasta
我知道如何对多个文件执行循环,但我不知道如何对同一文件的每一行执行循环(A.csv
)。你知道该怎么做吗?
答案1
你可能想尝试
awk -F, '{print "home/" $2 "_*/analyse/" $1 "_*_*/*consensus.fasta"}' file
这只是将一些字符串常量添加到您的文件中。awk
本身循环遍历输入文件的每一行。
编辑:
我从你的评论中读到,@nstatam,你想从你的输入文件构造一组文件路径,然后将所有这些文件连接到一个新文件中。您可以尝试这个,将每个路径添加到awk
的参数列表中,然后将所有路径打印到 stdout (可以/应该重定向到所需的文件):
awk -F, '
FNR==NR {ARGV[ARGC++] = "home/" $2 "_*/analyse/" $1 "_*_*/*consensus.fasta"
next}
1
' file
mawk
在1.3.4 20200120 (Ubuntu) 和版本 20110810 (FreeBSD)上测试awk
。请注意,这种“添加到参数列表”并不适用于所有awk
版本。
答案2
使用 awk 可以执行以下操作。这里我们逐个字段重建 $0 并以斜杠作为输出字段分隔符输出。
awk -F "," -v s="_*" '
{
t = "home,"$2 s",analyse,"$1 s s",*consensus.fasta"
split(t,a);$0=""
for (i=1; i in a; i++) $(i) = a[i]
}
1' OFS=/ A.csv
答案3
假设您想要读取文件的每一行,从该行中挑选出两个字段,并对与您显示的模式匹配的文件执行某些操作,那么您可以这样做:
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
printf 'Got number="%s" and run="%s"\n' "$number" "$run"
for name in home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
do
[ ! -e "$name" ] && continue
# Call program to process FastA file "$name".
printf 'Would process "%s"\n' "$name"
done
done
file.csv
这会跳过using的标题行tail
,然后将每一行解析为两个逗号分隔的字段,这些字段存储在 shell 变量number
和中run
。
对于每个$number
和$run
读取file.csv
,脚本然后循环遍历与模式匹配的名称home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
。如果模式匹配,将为每个匹配打印一条简单的消息(您可以选择执行其他操作)。
另一个脚本假设您可能希望将所有匹配的文件传递给某个程序的单次调用,对于读取的每一行file.csv
(如果模式完全匹配任何名称):
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
printf 'Got number="%s" and run="%s"\n' "$number" "$run"
set -- home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
[ ! -e "$1" ] && continue
# Call your command with the list of FastA files, "$@".
printf 'Would process "%s"\n' "$@"
# Other example:
# cat "$@" >"$run"-"$number"-consensus.fasta
done
如果您只想连接全部FastA 文件,然后可以这样做:
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
set -- home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
[ ! -e "$1" ] && continue
cat "$@"
done >consensus.fasta
或者,如果你是绝对确定这些模式总是会匹配某些文件(或者您不太担心一些“没有这样的文件或目录”错误):
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
cat home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
done >consensus.fasta
答案4
#!/usr/bin/python
k=open('file.txt','r')
k.readline()
for i in k:
var_fin=i.strip().split(',')
var_fj="home/{0}_*/analyse/{1}_*_*/*consensus.fasta".format(var_fin[1],var_fin[0])
print var_fj
输出
home/RUN120_*/analyse/2071410189_*_*/*consensus.fasta
home/RUN119_*/analyse/2071436273_*_*/*consensus.fasta
home/RUN120_*/analyse/2071507844_*_*/*consensus.fasta
home/RUN120_*/analyse/2071627356_*_*/*consensus.fasta
home/RUN118_*/analyse/2071627370_*_*/*consensus.fasta