提取列' x'来自多个文件,并使用' x'转置文件名。

时间:2016-05-02 17:49:52

标签: shell unix awk find cut

我正在尝试提取专栏" m"从多个txt文件(file1.txt,file2.txt ,,,等)并将每列转置到新文件中的一行。

以下是$CAML = "<Where> <Eq> <FieldRef Name='Period' /> <Value Type='Text'>$($month)</Value> </Eq> </Where>"

file1.txt

我希望有一个contig_1 contig_1 geneX ctg1_886;ctg1_887;ctg1_888 contig_2 contig_2 geneY ctg1_886;ctg1_887;ctg1_888 contig_3 contig_3 genesZ ctg1_886;ctg1_887;ctg1_888 文件,如下所示:

summary.txt

总行数可能因文件而异。我尝试使用file1 geneX geneY geneZ file2 geneA geneY . . . etc. 但没有成功。

2 个答案:

答案 0 :(得分:0)

根据评论中的glenn jackmans建议,GNU AWK解决方案将如下所示:

awk 'BEGIN {ORS=" "} BEGINFILE{print FILENAME} {print $3} ENDFILE{ printf("\n")}'  file*.txt

awk解决方案可能看起来像这样(对不起只有gnu awk进行测试):

awk 'BEGIN {ORS=" "} FNR==1 {printf("\n%s", FILENAME)} {print $3} END{printf("\n")} '

<强>解释

有几种特殊模式:

  • BEGIN,其动作在开头执行一次。这里ORS(输出记录分隔符)设置为空格,效果是从每个原始行获取一个新列,此转置步骤
  • END操作最后执行一次
  • BEGINFILEENDFILE操作在每个文件的处理开始和结束时执行一次。这里分别打印FILENAME换行符。

答案 1 :(得分:0)

假设字段分隔符是多个空格:

for f in file*.txt ; do 
    echo $f `tr -s ' ' < $f | cut -d ' ' -f 3`
done > summary.txt

如果数据分开<tab>

for f in file*.txt ; do 
    echo $f `cut -f 3 $f`
done > summary.txt