我有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
轻松完成,但不知道怎么做多行
答案 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
这具有额外的优点,即如果并非所有文件中都存在所有序列,它将起作用。