2011-06-23 3 views
5

Tôi có hai bộ thư mục có tệp có tên và cấu trúc cùng một tên và cấu trúc. Cấu trúc thư mục là một cái gì đó như thế này:Kết hợp hai tệp trong các thư mục khác nhau trong Linux

\outputfolder\ 
|---\folder1\ 
|  |---file1.txt 
|  |---file2.txt 
| 
|---\folder2\ 
     |---file1.txt 
     |---file2.txt 

Vì vậy, những gì tôi cần làm là kết hợp (append) tất cả các file có cùng tên trong các thư mục (file1.txt với file1.txt vv) vào một trong tệp đầu ra. Sau khi nhận được các tệp kết hợp này, tôi cũng cần phải tạo một tệp tar.gz từ tất cả các tệp được kết hợp này.

Làm cách nào để thực hiện điều này trong môi trường dòng lệnh dựa trên Linux? Tên thư mục (folder1 và folder2 vv) là biến vì vậy điều này cần phải được đưa ra nhưng các tệp không cần và nó sẽ tự động kết hợp tất cả các tệp có cùng tên.

Ngoài ra, các tệp này có tiêu đề cho tên cột, vì vậy, tôi cũng sẽ cần phải xóa tiêu đề đó trong khi thêm.

+1

Ý của bạn là "kết hợp [...] file1.txt với tệp1.txt"? Nối một cái khác? Cách nào xung quanh? – Johnsyweb

+0

yah bằng cách kết hợp tôi có nghĩa là nối thêm – sfactor

+0

Tôi chỉ nhìn thấy chỉnh sửa của bạn về tên cột ngay bây giờ. Tôi đã thêm mã vào câu trả lời của tôi sẽ xóa tiêu đề trong tệp thứ 2. Đoán đó là những gì bạn muốn ... – mhyfritz

Trả lời

4

Dưới đây là một số mã để giúp bạn bắt đầu

topdir=outputfolder 
dir1=folder1 
dir2=folder2 

for f in $topdir/$dir1/*.txt 
do 
    outf=$topdir/`basename $f .txt`-concat.txt 
    cp $f $outf 
    sed -e '1 d' $topdir/$dir2/`basename $f` >> $outf 
done 

tar czf foo.tar.gz $topdir/*-concat.txt 

Edit: thêm phần loại bỏ các tiêu đề của tập tin thứ 2.

0

Bạn đã thử lệnh cat (nối) chưa?

cat file1 file2 >> outputfile 

Có thể muốn bỏ qua điều này trong một tập lệnh bash nhỏ để đi qua thư mục. Điều này sẽ giúp bạn bắt đầu.

Chúc bạn may mắn. Leo

1
find . -name 'file1.txt' | xargs cat >file1_concat.txt 
1

này sẽ làm việc ngay cả khi có một số tập tin chỉ trong folder1 và một số tập tin chỉ trong folder2:

concat_files() { 
    for dir in "[email protected]"; do 
    for file in "$dir"/*; do 
     this=$(basename "$file") 
     { [[ -f "$this" ]] && sed 1d "$file" || cat "$file"; } >> "$this" 
    done 
    done 
    tar zcvf allfiles.tar.gz * 
} 

concat_files folder1 folder2 

Nó sẽ làm việc nếu bạn có nhiều hơn 2 thư mục cho việc nối của bạn.

Tôi giả sử bạn muốn giữ tiêu đề trong tệp kết quả.