我想写一个循环,分别用每个输入文件的第一列创建各种输出文件。
所以我写了
for i in $(\ls -d /home/*paired.isoforms.results)
do
awk -F"\t" {print $1}' $i > $i.transcript_ids.txt
done
例如,如果主目录中有5个名为
的文件A_paired.isoforms.results
B_paired.isoforms.results
C_paired.isoforms.results
D_paired.isoforms.results
E_paired.isoforms.results
我想将每个文件的第一列打印成一个单独的输出文件,即我希望有5个输出文件叫
A.transcript_ids.txt
B.transcript_ids.txt
C.transcript_ids.txt
D.transcript_ids.txt
E.transcript_ids.txt
或任何其他名称,只要它有5个不同的名称,我仍然可以将它们链接回原始文件。
我理解,在awk和loop命令中双重使用$存在问题,但我不知道如何更改它。
是否可以在循环中编写这样的命令?
答案 0 :(得分:0)
你可以完全用awk做到这一点:
awk -F"\t" '{split(FILENAME,a,"_"); out=a[1]".transcript_ids.txt"; print $1 > out}' *_paired.isoforms.results
如果您的输入文件没有问题中指示的名称,则必须在其他内容上split
(以及对输入文件使用不同的模式匹配)。
我的原始答案实际上是每次打印时都要进行额外的名称解析。这是仅在FILENAME
更改时更新输出文件名的版本:
awk -F"\t" 'FILENAME!=lf{split(FILENAME,a,"_"); out=a[1]".transcript_ids.txt"; lf=FILENAME} {print $1 > out}' *_paired.isoforms.results
答案 1 :(得分:0)
这应该做的工作:
for file in /home/*paired.isoforms.results
do
base=${file##*/}
base=${base%%_*}
awk -F"\t" '{print $1}' $file > $base.transcript_ids.txt
done
我假设第一个字段中可能有空格,因为您明确将分隔符设置为tab。每个文件运行awk
一次。有一些方法可以为所有文件运行awk
一次,但我不相信它的好处是显着的。您也可以考虑使用cut
代替awk '{print $1}'
。请注意,使用ls
并不如直接使用globbing更令人满意;它在名称中使用古怪字符(空格,制表符等)与文件名混淆。