如何将两行多个文件打印成具有特定顺序的新文件?

时间:2017-08-09 07:09:33

标签: awk

我有awk的任务。我正在对一些基因进行序列分析。 我有几个序列顺序的文件。我想将每个文件的第一个序列提取到新文件中,直到最后一个序列为止。我只知道如何处理awk的第一行或任何特定行。

awk 'FNR == 2 {print; nextfile}' *.txt > newfile

我在这里输入

档案1

Saureus081.1
ATCGGCCCTTAA
Saureus081.2
ATGCCTTAAGCTATA
Saureus081.3
ATCCTAAAGGTAAGG

文件2

SaureusRF1.1
ATCGGCCCTTAC
SauruesRF1.2
ATGCCTTAAGCTAGG
SaureusRF1.3
ATCCTAAAGGTAAGC

档案3

SaureusN305.1
ATCGGCCCTTACT
SauruesN305.2
ATGCCTTAAGCTAGA
SaureusN305.3
ATCCTAAAGGTAATG

类似的文件12就在那里 档案4 。 。 。 .File 12

必需的输出 NEWFILE

Saureus081.1
ATCGGCCCTTAA
SaureusRF1.1
ATCGGCCCTTAC
SaureusN305.1
ATCGGCCCTTACT
Saureus081.2
ATGCCTTAAGCTATA
SaureusRF1.2
ATGCCTTAAGCTAGG
SauruesN305.2
ATGCCTTAAGCTAGA
Saureus081.3
ATCCTAAAGGTAAGG
SaureusRF1.3
ATCCTAAAGGTAAGC
SaureusN305.3
ATCCTAAAGGTAATG

我想这个任务可以通过awk轻松完成,但不知道怎么做多行

3 个答案:

答案 0 :(得分:0)

粘贴 + awk 解决方案:

paste File1 File2 | awk '{ p=$2;$2="" }NR%2{ k=p; print }!(NR%2){ v=p; print $1 RS k RS v }'
  • paste File1 File2 - 合并相应的文件行

  • p=$2;$2="" - 从File2

  • 捕获第二个字段的值,该字段是相应的键/值

输出:

Seq1 
ATCGGCCCTTAA
Seq1
ATCGGCCCTTAC
Seq2 
ATGCCTTAAGCTATA
Seq2
ATGCCTTAAGCTAGG
Seq3 
ATCCTAAAGGTAAGG
Seq3
ATCCTAAAGGTAAGC

多个文件的附加方法:

paste Files[0-9]* | awk 'NR%2{ k=$1; n=NF; print k }
      !(NR%2){ print $1; for(i=2;i<=n;i++) print k RS $i }'

答案 1 :(得分:0)

根据修改过的问题,答案应该做一些改变。

$ awk -F'.' 'NR%2{k=$2;v=$0;getline;a[k]=a[k]?a[k] RS v RS $0:v RS $0} END{for(i in a)print a[i]}' file1 file2 file3
Saureus081.1
ATCGGCCCTTAA
SaureusRF1.1
ATCGGCCCTTAC
SaureusN305.1
ATCGGCCCTTACT 
Saureus081.2
ATGCCTTAAGCTATA
SauruesRF1.2
ATGCCTTAAGCTAGG
SauruesN305.2
ATGCCTTAAGCTAGA 
Saureus081.3
ATCCTAAAGGTAAGG
SaureusRF1.3
ATCCTAAAGGTAAGC
SaureusN305.3
ATCCTAAAGGTAATG

简要说明,

  • '.'设置为分隔符
  • 对于每个奇数记录,将k=$2区分为数组a
  • 的键
  • 调用getline设置下一条记录的$0,因为该值对应于密钥k
  • 打印最后一步的整个数组

答案 2 :(得分:0)

如果您的数据非常大,我建议您创建临时文件:

awk 'FNR%2==1 { filename = $1 }
              { print $0 >> filename }' file1 ... filen

之后,您可以cat将它们放在一起:

cat Seq1 ... Seqn > result

这具有额外的优点,即如果并非所有文件中都存在所有序列,它将起作用。