2013-08-09 49 views
5

Tôi có tệp txt, tất cả đều nằm trong cùng một thư mục. Mỗi loại có 2 cột dữ liệu. Họ trông như thế này:Làm cách nào để nối nhiều tệp txt vào cột?

Label1 DataA1
Label2 DataA2
Label3 DataA3

Tôi muốn sử dụng tham gia để thực hiện một một tập tin lớn như thế này.

Label1 DataA1 DataB1 DataC1
Label2 DataA2 DataB2 DataC2
Label3 DataA3 DataB3 DataC3

Hiện nay, tôi có

tham gia fileA fileB | join - fileC

Tuy nhiên, tôi có quá nhiều tệp để làm cho nó thực tế để liệt kê tất cả chúng - có cách nào để viết vòng lặp cho loại lệnh này không?

Trả lời

-1

Chỉ cần đặt tất cả các file trong một thư mục và làm

join * | join - /someotherdir/fileC 
+0

Nó chỉ trả về s hướng dẫn sử dụng cho lệnh join – Justin

+0

Không hoạt động. 'join: thiếu toán hạng sau' -'' –

0

Kịch bản này tham gia nhiều file với nhau (Các tập tin là file*).

#!/bin/bash 
# Create two temp files 
tmp=$(mktemp) 
tmp2=$(mktemp) 
# for all the files 
for file in file* 
do 
    # if the tmp file is not empty 
    if [ -s "$tmp" ] 
    then 
     # then join the tmp file with the current file 
     join "$tmp" "$file" > "$tmp2" 
    else 
     # the first time $tmp is empty, so we just copy the file 
     cp "$file" "$tmp2" 
    fi 
    cp "$tmp2" "$tmp" 
done 

cat "$tmp" 

Tôi thừa nhận rằng nó rất xấu, nhưng có vẻ như nó hoạt động.

2

Với awk bạn có thể làm điều đó như thế này:

awk 'NF > 0 { a[$1] = a[$1] " " $2 } END { for (i in a) { print i a[i]; } }' file* 

Nếu bạn muốn sắp xếp các file của bạn:

find -type f -maxdepth 1 -name 'file*' -print0 | sort -z | xargs -0 awk 'NF > 0 { a[$1] = a[$1] " " $2 } END { for (i in a) { print i a[i]; } }' 

Đôi khi cho (i trong a) populates các phím không theo thứ tự mà họ đã được thêm vào để bạn cũng có thể sắp xếp nó nhưng điều này chỉ có sẵn trong gawk. Ý tưởng về các khóa ánh xạ trong một mảng được lập chỉ mục cho thứ tự chỉ có thể xảy ra nếu cột 1 không có sự khác biệt.

gawk 'NF > 0 { a[$1] = a[$1] " " $2 } END { count = asorti(a, b); for (i = 1; i <= count; ++i) { j = b[i]; print j a[j]; } }' ... 
4

Với bash bạn có thể tạo ra một kịch bản mà không một ống exec đệ quy cho tham gia:

#!/bin/bash 

if [[ $# -ge 2 ]]; then 
    function __r { 
     if [[ $# -gt 1 ]]; then 
      exec join - "$1" | __r "${@:2}" 
     else 
      exec join - "$1" 
     fi 
    } 

    __r "${@:2}" < "$1" 
fi 

Và vượt qua các tập tin như tham số cho kịch bản như:

bash script.sh file* 

Hoặc một mẫu được sắp xếp như:

find -type f -maxdepth 1 -name 'file*' -print0 | sort -z | xargs -0 bash script.sh 
Các vấn đề liên quan