2011-06-23 15 views
5

Mam dwa zestawy folderów z plikami o nazwach i strukturze o strukturze. Struktura folderów jest coś takiego:Łączenie dwóch plików w różnych folderach w systemie Linux

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

Więc co muszę zrobić, to połączyć (dołącz) wszystkie pliki o tej samej nazwie w tych folderach (file1.txt z plik1.txt itd.) Do innego plik wewnątrz pliku wyjściowego. Po uzyskaniu tych połączonych plików muszę również utworzyć plik tar.gz ze wszystkich połączonych plików.

Jak mogę to zrobić w środowisku wiersza poleceń opartym na systemie Linux? Nazwa folderu (folder1 i folder2 itd.) Jest zmienna, więc trzeba to podać, ale pliki nie muszą i powinny automatycznie łączyć wszystkie pliki o tej samej nazwie.

Te pliki mają również nagłówki nazw kolumn, więc muszę je również usunąć podczas dodawania.

+1

Co masz na myśli "połączyć [...] plik1.txt z plikiem1.txt"? Dołącz jeden do drugiego? Którędy? – Johnsyweb

+0

yah przez łączenie oznacza dodanie – sfactor

+0

Widziałem tylko twoją zmianę dotyczącą nazw kolumn. Dodałem kod do mojej odpowiedzi, który usunie nagłówek z drugiego pliku. Zgadnij, że tego chcesz ... – mhyfritz

Odpowiedz

4

Oto niektóre kodu do należy zacząć

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: dodano część usuwając nagłówek 2. pliku.

0

Czy próbowałeś komendy cat (konkatenacja)?

cat file1 file2 >> outputfile 

Może zaatakować to w małym skrypcie bash, aby przejść przez katalog. Powinno cię to zacząć.

Powodzenia. Leo

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

To będzie działać nawet jeśli istnieją jakieś pliki w folderze folder1 i tylko niektóre pliki tylko w folderze 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 

będzie działać, jeśli masz więcej niż 2 foldery dla zadania konkatenacji.

Zakładam, że chcesz zachować nagłówek w wynikowym pliku.

Powiązane problemy