Bash 创建合并两列的新列

Bash 创建合并两列的新列,bash,awk,sed,Bash,Awk,Sed,我有100个类似格式的文件(如下所示)。我想在每个文件中添加一个新列,这些文件组合了列mir和seq,并由\uu 这必须为所有文件自动完成。我的所有文件都有以下名称: Miraligner_240G.txt.mirna Miraligner_239R.txt.mirna .... 它们在u和.txt.mirna之间有所不同 我的输入文件如下所示: seq name freq mir start end mism a

我有100个类似格式的文件(如下所示)。我想在每个文件中添加一个新列,这些文件组合了列
mir
seq
,并由
\uu
这必须为所有文件自动完成。我的所有文件都有以下名称:

Miraligner_240G.txt.mirna
Miraligner_239R.txt.mirna
....
它们在u和.txt.mirna之间有所不同

我的输入文件如下所示:

seq                     name          freq  mir           start end mism add    t5  t3       s5         s3    DB  ambiguity
TGAGAAGAAGCACTGTAGCTCTT seq_100006_x2   2   hsa-miR-143-3p  61  81  6AT u-TT    0   0   AGTCTGAG    GCTCAGGA    miRNA   1
GACCCTGTAGATCCGAATTTGTA seq_100012_x2   2   hsa-miR-10a-5p  22  43  1GT u-A 0   u-G TATATACC    TGTGTAAG    miRNA   1
GACCCTGTAGATCCGAATTTGTG seq_100013_x35  35  hsa-miR-10a-5p  22  44  1GT 0   0   0   TATATACC    TGTGTAAG    miRNA   1
TTAGGGCCCTGGCTCCATCT    seq_100019_x13  13  hsa-miR-1296-5p 16  35  0   0   0   u-CC    TGGGTTAG    CTCCTTTA    miRNA   1
GTGAACGGGCGCCATCCCGAGGCTT   seq_100029_x2   2   hsa-miR-887-3p  48  72  0   0   0   d-CTT   TGGAGTGA    GAGGCTTT    miRNA   1
ACCCGGTAGATCCGAATTTGTG  seq_10002_x5    5   hsa-miR-10a-5p  23  44  5GT 0   d-T 0   TATATACC    TGTGTAAG    miRNA   1
CAACGGAATCCCAAAAGCAGCTGAAAA seq_100031_x3   3   hsa-miR-191-5p  16  39  24AT    u-AAA   0   d-T CGGGCAAC    GCTGTTGT    miRNA   1
TAGTGCAATATTGCTTATAGGGTAT   seq_100033_x2   2   hsa-miR-454-3p  64  86  0   u-AT    0   0   TGAGTAGT    GGGTTTTG    miRNA   1
CAACGGAATCCGAAAAGCAGCTG seq_100037_x16  16  hsa-miR-191-5p  16  38  12GC    0   0   0   CGGGCAAC    GCTGTTGT    miRNA   1
mir_seq                                  seq                        name          freq  mir           start end mism add t5 t3       s5         s3    DB  ambiguity
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT   TGAGAAGAAGCACTGTAGCTCTT    seq_100006_x2   2   hsa-miR-143-3p  61  81  6AT u-TT    0   0   AGTCTGAG    GCTCAGGA    miRNA   1
....
....
我的输出文件应如下所示:

seq                     name          freq  mir           start end mism add    t5  t3       s5         s3    DB  ambiguity
TGAGAAGAAGCACTGTAGCTCTT seq_100006_x2   2   hsa-miR-143-3p  61  81  6AT u-TT    0   0   AGTCTGAG    GCTCAGGA    miRNA   1
GACCCTGTAGATCCGAATTTGTA seq_100012_x2   2   hsa-miR-10a-5p  22  43  1GT u-A 0   u-G TATATACC    TGTGTAAG    miRNA   1
GACCCTGTAGATCCGAATTTGTG seq_100013_x35  35  hsa-miR-10a-5p  22  44  1GT 0   0   0   TATATACC    TGTGTAAG    miRNA   1
TTAGGGCCCTGGCTCCATCT    seq_100019_x13  13  hsa-miR-1296-5p 16  35  0   0   0   u-CC    TGGGTTAG    CTCCTTTA    miRNA   1
GTGAACGGGCGCCATCCCGAGGCTT   seq_100029_x2   2   hsa-miR-887-3p  48  72  0   0   0   d-CTT   TGGAGTGA    GAGGCTTT    miRNA   1
ACCCGGTAGATCCGAATTTGTG  seq_10002_x5    5   hsa-miR-10a-5p  23  44  5GT 0   d-T 0   TATATACC    TGTGTAAG    miRNA   1
CAACGGAATCCCAAAAGCAGCTGAAAA seq_100031_x3   3   hsa-miR-191-5p  16  39  24AT    u-AAA   0   d-T CGGGCAAC    GCTGTTGT    miRNA   1
TAGTGCAATATTGCTTATAGGGTAT   seq_100033_x2   2   hsa-miR-454-3p  64  86  0   u-AT    0   0   TGAGTAGT    GGGTTTTG    miRNA   1
CAACGGAATCCGAAAAGCAGCTG seq_100037_x16  16  hsa-miR-191-5p  16  38  12GC    0   0   0   CGGGCAAC    GCTGTTGT    miRNA   1
mir_seq                                  seq                        name          freq  mir           start end mism add t5 t3       s5         s3    DB  ambiguity
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT   TGAGAAGAAGCACTGTAGCTCTT    seq_100006_x2   2   hsa-miR-143-3p  61  81  6AT u-TT    0   0   AGTCTGAG    GCTCAGGA    miRNA   1
....
....

使用
awk
可以添加包含第1列和第4列值的列,如下所示:

awk '{print $4"_"$1, $0}' filename
OFS
将打印输出字段分隔符变量的值

通过管道将输出传输到
列-t

mir_seq                                     seq                          name            freq  mir              start  end  mism  add    t5   t3     s5        s3        DB     ambiguity
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT      TGAGAAGAAGCACTGTAGCTCTT      seq_100006_x2   2     hsa-miR-143-3p   61     81   6AT   u-TT   0    0      AGTCTGAG  GCTCAGGA  miRNA  1
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTA      GACCCTGTAGATCCGAATTTGTA      seq_100012_x2   2     hsa-miR-10a-5p   22     43   1GT   u-A    0    u-G    TATATACC  TGTGTAAG  miRNA  1
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTG      GACCCTGTAGATCCGAATTTGTG      seq_100013_x35  35    hsa-miR-10a-5p   22     44   1GT   0      0    0      TATATACC  TGTGTAAG  miRNA  1
hsa-miR-1296-5p_TTAGGGCCCTGGCTCCATCT        TTAGGGCCCTGGCTCCATCT         seq_100019_x13  13    hsa-miR-1296-5p  16     35   0     0      0    u-CC   TGGGTTAG  CTCCTTTA  miRNA  1
hsa-miR-887-3p_GTGAACGGGCGCCATCCCGAGGCTT    GTGAACGGGCGCCATCCCGAGGCTT    seq_100029_x2   2     hsa-miR-887-3p   48     72   0     0      0    d-CTT  TGGAGTGA  GAGGCTTT  miRNA  1
hsa-miR-10a-5p_ACCCGGTAGATCCGAATTTGTG       ACCCGGTAGATCCGAATTTGTG       seq_10002_x5    5     hsa-miR-10a-5p   23     44   5GT   0      d-T  0      TATATACC  TGTGTAAG  miRNA  1
hsa-miR-191-5p_CAACGGAATCCCAAAAGCAGCTGAAAA  CAACGGAATCCCAAAAGCAGCTGAAAA  seq_100031_x3   3     hsa-miR-191-5p   16     39   24AT  u-AAA  0    d-T    CGGGCAAC  GCTGTTGT  miRNA  1
hsa-miR-454-3p_TAGTGCAATATTGCTTATAGGGTAT    TAGTGCAATATTGCTTATAGGGTAT    seq_100033_x2   2     hsa-miR-454-3p   64     86   0     u-AT   0    0      TGAGTAGT  GGGTTTTG  miRNA  1
hsa-miR-191-5p_CAACGGAATCCGAAAAGCAGCTG      CAACGGAATCCGAAAAGCAGCTG      seq_100037_x16  16    hsa-miR-191-5p   16     38   12GC  0      0    0      CGGGCAAC  GCTGTTGT  miRNA  1
由于
awk
没有内联编辑选项,因此必须使用
gawk
进行内联编辑。使用
awk
,您可以将输出写入临时文件,然后将其移动/复制/重命名为原始文件名

要在多个文件中使用该命令,请执行以下操作:

for i in Miraligner_*.txt.mirna; do
    awk '{print $4"_"$1, $0}' "$i" | column -t;
done
如果您正在使用
gawk
并对进行内联编辑感兴趣,请使用
gawk-i inplace


使用
perl

perl -ane 'print "$F[3]_$F[0] $_";' filename | column -t
如果要写入文件,请使用
-i
选项:

perl -ane 'print "$F[3]_$F[0] $_";' -i filename
\t
分隔所有输入字段和附加列(字段):

perl -ane '$"="\t"; print "$F[3]_$F[0] @F\n";' -i filename

如果您希望在文件中以适当的表格形式输出:

for i in Miraligner_*.txt.mirna; do
    awk '{print $4"_"$1, $0}' "$i" | column -t > temp && mv temp "$i";
done
这将在您的文件中将输出分隔为适当的列。为此,您不需要内联编辑选项



感谢@EdMorton纠正了我的错误。

使用
awk
可以添加一列,其中包含第1列和第4列的值,如下所示:

awk '{print $4"_"$1, $0}' filename
OFS
将打印输出字段分隔符变量的值

通过管道将输出传输到
列-t

mir_seq                                     seq                          name            freq  mir              start  end  mism  add    t5   t3     s5        s3        DB     ambiguity
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT      TGAGAAGAAGCACTGTAGCTCTT      seq_100006_x2   2     hsa-miR-143-3p   61     81   6AT   u-TT   0    0      AGTCTGAG  GCTCAGGA  miRNA  1
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTA      GACCCTGTAGATCCGAATTTGTA      seq_100012_x2   2     hsa-miR-10a-5p   22     43   1GT   u-A    0    u-G    TATATACC  TGTGTAAG  miRNA  1
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTG      GACCCTGTAGATCCGAATTTGTG      seq_100013_x35  35    hsa-miR-10a-5p   22     44   1GT   0      0    0      TATATACC  TGTGTAAG  miRNA  1
hsa-miR-1296-5p_TTAGGGCCCTGGCTCCATCT        TTAGGGCCCTGGCTCCATCT         seq_100019_x13  13    hsa-miR-1296-5p  16     35   0     0      0    u-CC   TGGGTTAG  CTCCTTTA  miRNA  1
hsa-miR-887-3p_GTGAACGGGCGCCATCCCGAGGCTT    GTGAACGGGCGCCATCCCGAGGCTT    seq_100029_x2   2     hsa-miR-887-3p   48     72   0     0      0    d-CTT  TGGAGTGA  GAGGCTTT  miRNA  1
hsa-miR-10a-5p_ACCCGGTAGATCCGAATTTGTG       ACCCGGTAGATCCGAATTTGTG       seq_10002_x5    5     hsa-miR-10a-5p   23     44   5GT   0      d-T  0      TATATACC  TGTGTAAG  miRNA  1
hsa-miR-191-5p_CAACGGAATCCCAAAAGCAGCTGAAAA  CAACGGAATCCCAAAAGCAGCTGAAAA  seq_100031_x3   3     hsa-miR-191-5p   16     39   24AT  u-AAA  0    d-T    CGGGCAAC  GCTGTTGT  miRNA  1
hsa-miR-454-3p_TAGTGCAATATTGCTTATAGGGTAT    TAGTGCAATATTGCTTATAGGGTAT    seq_100033_x2   2     hsa-miR-454-3p   64     86   0     u-AT   0    0      TGAGTAGT  GGGTTTTG  miRNA  1
hsa-miR-191-5p_CAACGGAATCCGAAAAGCAGCTG      CAACGGAATCCGAAAAGCAGCTG      seq_100037_x16  16    hsa-miR-191-5p   16     38   12GC  0      0    0      CGGGCAAC  GCTGTTGT  miRNA  1
由于
awk
没有内联编辑选项,因此必须使用
gawk
进行内联编辑。使用
awk
,您可以将输出写入临时文件,然后将其移动/复制/重命名为原始文件名

要在多个文件中使用该命令,请执行以下操作:

for i in Miraligner_*.txt.mirna; do
    awk '{print $4"_"$1, $0}' "$i" | column -t;
done
如果您正在使用
gawk
并对进行内联编辑感兴趣,请使用
gawk-i inplace


使用
perl

perl -ane 'print "$F[3]_$F[0] $_";' filename | column -t
如果要写入文件,请使用
-i
选项:

perl -ane 'print "$F[3]_$F[0] $_";' -i filename
\t
分隔所有输入字段和附加列(字段):

perl -ane '$"="\t"; print "$F[3]_$F[0] @F\n";' -i filename

如果您希望在文件中以适当的表格形式输出:

for i in Miraligner_*.txt.mirna; do
    awk '{print $4"_"$1, $0}' "$i" | column -t > temp && mv temp "$i";
done
这将在您的文件中将输出分隔为适当的列。为此,您不需要内联编辑选项



感谢@EdMorton纠正了我的错误。

如何对所有文件执行此操作?我试着这样做:对于Miraligner*.txt.mirna中的f,请执行awk'{print$4“{1 of s$0}'”$f“>“MiralignerMerge${f#}”将for循环打印到同一个文件?@BioMan,如我所述,如果要执行内联编辑,请使用
gawk
perl
。这是因为
awk
没有内联编辑选项。如果您愿意,我可以在
perl
中添加答案。请给我看一下perl答案。我也将尝试gawk是否可以不使用最新的for循环覆盖输入文件?如何对所有文件执行此操作?我试着这样做:对于Miraligner*.txt.mirna中的f,请执行awk'{print$4“{1 of s$0}'”$f“>“MiralignerMerge${f#}”将for循环打印到同一个文件?@BioMan,如我所述,如果要执行内联编辑,请使用
gawk
perl
。这是因为
awk
没有内联编辑选项。如果您愿意,我可以在
perl
中添加答案。请给我看一下perl答案。我也将尝试gawk。是否可以不使用最新的for循环覆盖输入文件?