我有 20 个具有相同行数的制表符分隔文件。我想选择每个文件的每第四列,粘贴的一起到一个新文件。最后,新文件将有 20 列,每列来自 20 个不同的文件。
如何使用 Unix/Linux 命令执行此操作?
输入,20 个相同格式。我希望文件 1 的第四列在此处表示为 A1:
chr1 1734966 1735009 A1 0 0 0 0 0 1 0
chr1 2074087 2083457 A1 0 1 0 0 0 0 0
chr1 2788495 2788535 A1 0 0 0 0 0 0 0
chr1 2821745 2822495 A1 0 0 0 0 0 1 0
chr1 2821939 2822679 A1 1 0 0 0 0 0 0
...
输出文件,有 20 列,每列来自 20 个文件的第 4 列之一:
A1 A2 A3 ... A20
A1 A2 A3 ... A20
A1 A2 A3 ... A20
A1 A2 A3 ... A20
A1 A2 A3 ... A20
...
答案1
在paste
bash 下你可以这样做:
paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt)
使用 python 脚本和任意数量的文件 ( python scriptname.py column_nr file1 file2 ... filen
):
#! /usr/bin/env python
# invoke with column nr to extract as first parameter followed by
# filenames. The files should all have the same number of rows
import sys
col = int(sys.argv[1])
res = {}
for file_name in sys.argv[2:]:
for line_nr, line in enumerate(open(file_name)):
res.setdefault(line_nr, []).append(line.strip().split('\t')[col-1])
for line_nr in sorted(res):
print '\t'.join(res[line_nr])
答案2
以下脚本使用 awk 执行此操作。为了方便起见,我添加了一个行号,它表示文件中的行数 (r)。您要粘贴的列数由 c 指示。
directory=/your-directory/
r=4
c=20
for n in $(seq 1 $r); do
echo "$n" >> rownumber.txt
done
for n in $(seq 1 $c); do
awk '{ print $4}' /$directory/file-$n.txt > /$directory/output-$n.txt
done
paste /$directory/rownumber.txt /$directory/output-[1-$c]*.txt > /$directory/newfile.txt