gpt4 book ai didi

linux - 根据另一个行迭代生成新文件

转载 作者:太空宇宙 更新时间:2023-11-04 11:49:38 25 4
gpt4 key购买 nike

我有两个不同的文件,我想从中提取一些行并生成新文件。所以我的第一个文件看起来像这样,file1.tsv:

A       B       C       D       E       Example  Set     Group
0 0 27 0 0 exA sub9 1
0 0 45 12 12 exA sub14 0
1 1 45 14 6 exA sub6 0
2 2 65 7 8 exA sub2 1
3 3 68 9 14 exA sub13 0
4 4 70 8 13 exA sub5 0
5 5 75 3 11 exA sub8 1
6 6 79 10 7 exA sub7 1
7 7 85 13 5 exA sub12 1
8 8 88 5 4 exA sub1 0
9 9 90 1 1 exA sub10 1
10 10 92 2 2 exA sub3 0
11 11 98 4 3 exA sub4 1
12 12 108 12 10 exA sub11 1

我的第二个文件是矢量 file2.vec:

1 1:3.000 2:0.000 3:0.000 4:4.000 5:0.000 #(Aid=sub1, Bid=exA, group=1)
2 1:0.000 2:1.000 3:2.000 4:5.000 5:0.000 #(Aid=sub2, Bid=exA, group=2)
1 1:2.000 2:3.000 3:0.000 4:0.000 5:0.000 #(Aid=sub3, Bid=exA, group=1)
2 1:0.000 2:5.000 3:1.000 4:2.000 5:0.000 #(Aid=sub4, Bid=exA, group=2)
1 1:0.000 2:1.000 3:1.000 4:2.000 5:0.000 #(Aid=sub5, Bid=exA, group=1)
1 1:5.000 2:0.000 3:1.000 4:3.000 5:0.000 #(Aid=sub6, Bid=exA, group=1)
2 1:1.000 2:0.000 3:1.000 4:1.000 5:0.000 #(Aid=sub7, Bid=exA, group=2)
1 1:4.000 2:2.000 3:0.000 4:1.000 5:0.000 #(Aid=sub8, Bid=exA, group=1)
2 1:0.000 2:1.000 3:0.000 4:4.000 5:0.000 #(Aid=sub9, Bid=exA, group=2)
2 1:0.000 2:0.000 3:1.000 4:0.000 5:0.000 #(Aid=sub10, Bid=exA, group=2)
2 1:4.000 2:2.000 3:1.000 4:2.000 5:0.000 #(Aid=sub11, Bid=exA, group=2)
2 1:0.000 2:4.000 3:1.000 4:2.000 5:0.000 #(Aid=sub12, Bid=exA, group=2)
1 1:4.000 2:2.000 3:1.000 4:0.000 5:0.000 #(Aid=sub13, Bid=exA, group=1)
1 1:2.000 2:0.000 3:1.000 4:1.000 5:0.000 #(Aid=sub14, Bid=exA, group=1)

我想使用 file1.tsv 第 7 列(标题:Set)中的数据生成新文件,其中将打印 file2.vec 中的相应行,并且对于每次迭代我想添加一个新行到之前的输出。因此,例如,第一行(如果我们不计算标题)是 file1.tsv 中的 sub9 并且可以使用 Aid 链接 file2.vec 中的相应数据,因此输出将是:

out1.vec 
2 1:0.000 2:1.000 3:0.000 4:4.000 5:0.000

我现在想要这样的多个输出:

out2.vec 
2 1:0.000 2:1.000 3:0.000 4:4.000 5:0.000
1 1:2.000 2:0.000 3:1.000 4:1.000 5:0.000

out3.vec
2 1:0.000 2:1.000 3:0.000 4:4.000 5:0.000
1 1:2.000 2:0.000 3:1.000 4:1.000 5:0.000
1 1:5.000 2:0.000 3:1.000 4:3.000 5:0.000

...
out4-13

out14.vec
2 1:0.000 2:1.000 3:0.000 4:4.000 5:0.000
1 1:2.000 2:0.000 3:1.000 4:1.000 5:0.000
1 1:5.000 2:0.000 3:1.000 4:3.000 5:0.000
2 1:0.000 2:1.000 3:2.000 4:5.000 5:0.000
1 1:4.000 2:2.000 3:1.000 4:0.000 5:0.000
1 1:0.000 2:1.000 3:1.000 4:2.000 5:0.000
1 1:4.000 2:2.000 3:0.000 4:1.000 5:0.000
2 1:1.000 2:0.000 3:1.000 4:1.000 5:0.000
2 1:0.000 2:4.000 3:1.000 4:2.000 5:0.000
1 1:3.000 2:0.000 3:0.000 4:4.000 5:0.000
2 1:0.000 2:0.000 3:1.000 4:0.000 5:0.000
1 1:2.000 2:3.000 3:0.000 4:0.000 5:0.000
2 1:0.000 2:5.000 3:1.000 4:2.000 5:0.000
2 1:4.000 2:2.000 3:1.000 4:2.000 5:0.000

我有一个包含多个文件(如 file1.tsv)的目录,我想对每个文件执行前面描述的过程。所以我试着写了一个shell脚本:

# first to extract column 7 
for filename in File; do
listFile=$(basename "$filename" .tsv)-cmpdsList.tsv
awk '{if (NR!=1) {print $7}}' $filename \
> $listFile
done

# second to generate files containing lines from previously generated list
for line in $(cat $listFile); do
echo "$line" > $line.vec
done

# add information corresponding to the compounds to generate vector file
for file in $line.vec; do
output=$(basename "$line.vec" .vec)-output.vec
gawk 'BEGIN {RS="\n"; ORS="\n"} (NR==FNR){a[$1]=$0; next} ($1 in a){print a[$1]}' $file RS="\n" $line.vec > $output
done

但它只会生成空矢量文件。谢谢!

最佳答案

首先对您的代码进行一些评论:

# first to extract column 7 
for filename in File; do
  • File 是一个字符串。也许你想要一个 fileglob 在这里?
        listFile=$(basename "$filename" .tsv)-cmpdsList.tsv
awk '{if (NR!=1) {print $7}}' $filename \
> $listFile
  • awk 命令可以缩短为:awk 'NR>1 {print $7}' ...
  • 引用 $listFile 的用法更安全:"$listFile"
done

# second to generate files containing lines from previously generated list
for line in $(cat $listFile); do
echo "$line" > $line.vec
done
  • 如果 $linesub9 或类似的,它不能同时是 out1
# add information corresponding to the compounds to generate vector file
for file in $line.svm; do
output=$(basename "$line.svm" .svm)-output.vec
gawk 'BEGIN {RS="\n"; ORS="\n"} (NR==FNR){a[$1]=$0; next} ($1 in a){print a[$1]}' $file RS="\n" $line.svm > $output
done
  • 您的样本不包含任何难以解释此代码的 .svm 文件

可能的 awk 解决方案

基于您的 file1.tsvfile2.vec(假设第一行开头缺少的 1 是错字)和输出的描述,一个可能的 awk 解决方案是:

awk '
NR==FNR && NR>1 {
n++
aid[$7] = n
next
}
NR!=FNR {
pat = $7
sub(/^#[(]Aid=/, "", pat)
sub(/,$/, "", pat)
sub(/ #.*$/, "", $0)
line[ aid[pat] ] = $0
}
END {
for (i=1; i<=n; i++) {
out = "out" i ".vec"
printf "" > out
for (j=1; j<=i; j++) {
print line[j] >> out
}
close(out)
}
}
' file1.tsv file2.vec
  • NR==FNR ... - 取出 id 并将其映射到行号
  • NR!=FNR ... - 从 $7 中的 id 算出行,从 $0 中去除尾随字段并存储
  • END ... - 对于每一行,将它和所有前面的内容输出到适当的输出文件
  • close - 写入后关闭文件以避免用完文件描述符

关于linux - 根据另一个行迭代生成新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56432305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com