如何在循环中编写awk print命令?

时间:2014-03-10 05:58:56

标签: shell loops unix printing awk

我想写一个循环,分别用每个输入文件的第一列创建各种输出文件。

所以我写了

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命令中双重使用$存在问题,但我不知道如何更改它。

是否可以在循环中编写这样的命令?

2 个答案:

答案 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更令人满意;它在名称中使用古怪字符(空格,制表符等)与文件名混淆。