Chọn cột nhất định của mỗi tệp, dán vào tệp mới


7

Tôi có 20 tệp được phân tách bằng tab với cùng số lượng hàng. Tôi muốn chọn mỗi cột thứ 4 của mỗi tệp, dán cùng một tệp mới. Cuối cùng, tệp mới sẽ có 20 cột với mỗi cột đến từ 20 tệp khác nhau.

Làm thế nào tôi có thể làm điều này với (các) lệnh Unix / Linux?

Đầu vào, 20 định dạng tương tự, tôi muốn cột thứ 4 được ký hiệu ở đây là A1 cho tệp 1:

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 
...

Tệp đầu ra, với 20 cột, mỗi cột đến từ một trong số 4 cột của 20 tệp:

A1       A2       A3       ...       A20        
A1       A2       A3       ...       A20     
A1       A2       A3       ...       A20       
A1       A2       A3       ...       A20        
A1       A2       A3       ...       A20 
...

cắt là lệnh lấy colomun từ tập tin. và dán là một lệnh khác dán colomns theo chiều ngang. kiểm tra: cắt người, dán người đàn ông
Vineeth Chowdhary

3
Vui lòng chỉnh sửa câu hỏi của bạn và cho chúng tôi một ví dụ về các tệp đầu vào và đầu ra mong muốn của bạn. Cột được định nghĩa như thế nào? Không gian? Dấu phẩy? Tab? Thứ gì khác?
terdon

Tôi đã thay đổi câu hỏi của bạn để làm cho nó trực tiếp hơn, vì những người khác (và có thể bạn) có thể muốn biết cách thực hiện những gì bạn đang hỏi, không chỉ khi mọi người tồn tại có khả năng giải quyết vấn đề như vậy.
Anthon

Cảm ơn các ý kiến. Tôi đã chỉnh sửa câu hỏi của tôi. Hy vọng là rõ ràng biết.
Jun Cheng

2
@JunCheng paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt). Điều đó hoạt động vì cuttheo mặc định cắt trên các trường được phân cách bằng TAB. Nếu câu hỏi được mở lại, tôi cũng sẽ đăng nó như một câu trả lời.
Anthon

Câu trả lời:


4

với pastebash bạn có thể làm:

paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt)

Với tập lệnh python và bất kỳ số lượng tệp ( 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

Kịch bản sau đây thực hiện điều này bằng cách sử dụng awk. Tôi đã thêm vào cho thuận tiện một số thứ tự, cho biết số lượng hàng trong tệp của bạn (r). Số lượng cột bạn muốn dán được chỉ định bởi 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.