首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的循环输出到一个连接的文件,而不是几个单独的文件

我的循环输出到一个连接的文件,而不是几个单独的文件
EN

Stack Overflow用户
提问于 2021-02-02 00:35:50
回答 2查看 26关注 0票数 0

我有一组tsv文件,每个文件有7列,但我只对第1列和第7列感兴趣。每个文件的格式都是: SampleName.bam.S.txt。

Example: 7805.bam.S.txt 7806.bam.S.txt 7808.bam.S.txt etc...

我试过两种方法:

代码语言:javascript
复制
1) find . -type f -name '*.S.txt' -exec cut -f 1,7 {} > {}.F \; and
2) for f in '*.S.txt';do cut -f 1,7 "$f" > "$f".F;done

我想要的是我的目录现在是

代码语言:javascript
复制
7805.bam.S.txt 7805.bam.S.txt.F 7806.bam.S.txt 7806.bam.S.txt.F 7808.bam.S.txt 7808.bam.S.txt.F etc...

但我得到的却是

代码语言:javascript
复制
1) 7805.bam.S.txt 7806.bam.S.txt 7808.bam.S.txt etc... {}.F
2) 7805.bam.S.txt 7806.bam.S.txt 7808.bam.S.txt etc... $f.F

其中生成的文件中写入了所有输出,但是如何让每次迭代生成唯一的文件名?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-02 02:08:32

如果我没理解错的话,我会这么做的。同意前面关于awk处理tsv/csv的答案--这绝对是正确的工具。我只是发现用于迭代的bash语法和变量比awk语法更容易记住。

代码语言:javascript
复制
find . -type f -name "*.S.txt" | while read FILE;do awk -F"\t" '{print $1"\t"$7}' $FILE > $FILE.F;done
票数 0
EN

Stack Overflow用户

发布于 2021-02-02 01:43:00

根据您的示例,awk可能是更好的候选者。

代码语言:javascript
复制
find . -maxdepth 1 -name "*.S.txt" -exec awk -F "\t" '{ printf "%s\t%s\n",$1,$7 }' '{}' > '{}'.F \;

找到所有以.S.txt结尾的文件,然后使用找到的文件执行一条awk语句,该语句将tab设置为字段分隔符,然后仅打印由制表符分隔的第一个和第七个字段。我们将输出重定向到另一个同名的文件,但末尾带有".F“。

或者,您可以直接打印到awk本身中的文件。然后,您可以使用find (+)中的文件组,并提高效率:

代码语言:javascript
复制
find . -maxdepth 1 -name "*.S.txt" -exec awk -F "\t" '{ printf "%s\t%s\n",$1,$7 >> FILENAME".F" }' '{}' +
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65996522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档