2013-05-06 40 views
52

Mam dwa pliki (plik1.txt & file2.txt), pliki są jedynie przykładami.jak scalić dwa pliki konsekwentnie linia po linii

Jak scalić dwa pliki, w celu utworzenia pliku - merge_files.txt jako przykład 3

piszę teraz ksh skrypt, więc scalania można zrobić z ksh, awk, sed, perl jednym wkładka ... itd

Background - dlaczego trzeba scalić pliki: moim celem jest, aby zmienić nazwę starego pliku (istnieje w pierwszym polu) do nowy plik (istnieją w drugim polu),

Przykład1

more file1.txt 

/etc/port1-192.9.200.1-255.555.255.0 
/etc/port2-192.9.200.1-255.555.255.0 
/etc/port3-192.9.200.1-255.555.255.0 
/etc/port4-192.9.200.1-255.555.255.0 
/etc/port5-192.9.200.1-255.555.255.0 
. 
. 
. 
. 

Przykład2

more file2.txt 

/etc/port1-192.90.2.1-255.555.0.0 
/etc/port2-192.90.2.1-255.555.0.0 
/etc/port3-192.90.2.1-255.555.0.0 
/etc/port4-192.90.2.1-255.555.0.0 
/etc/port5-192.90.2.1-255.555.0.0 
. 
. 
. 
. 

Przykład3

more merge_files.txt 



/etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 
/etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 
/etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 
/etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 
/etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0 
. 
. 
. 
. 
. 

Przykład 4 (struktura merge_files.txt)

first field       second field 

OLD file        NEW file 
+0

są dwa pliki, zawsze tej samej długości? (twoim ostatnim celem jest tylko zmiana nazwy plików, a usuniesz plik 'merge_files.txt' po zmianie nazwy plików?) – MisterJ

+0

Nie jest to tylko przykład (długość lub PATH może być bardziej zróżnicowana) i zawartość pliku może być również różna (nie trzeba usunąć polecenie merge_files.txt) –

Odpowiedz

94

można użyć paste formatowania pliki obok siebie:

$ paste -d" " file1.txt file2.txt 
/etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 
/etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 
/etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 
/etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 
/etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0 

Np .:

$ paste -d" " file1.txt file2.txt | while read from to; do echo mv "${from}" "${to}"; done 
mv /etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 
mv /etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 
mv /etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 
mv /etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 
mv /etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0 

Oczywiście, co chcesz rzucać w niektórych kontroli bezpieczeństwa ([ -f "${from}" ] ...).

Nota prawna: Działa tylko wtedy, gdy w nazwach plików nie ma spacji.

+0

wklej zdefiniowane w linux i solaris? , ponieważ mój skrypt działa na obu systemach operacyjnych (linux i solaris) –

+0

'wklej 'jest dostępny w każdym systemie zgodnym z [POSIX] (http://pubs.opengroup.org/onlinepubs/009695299/utilities/paste.html) i zarówno Linux, jak i Solaris są dostarczane wraz z nim ([tutaj] (http://docs.oracle.com/cd/E19253-01/816-5165/6mbb0m9n5/index.html) to strona podręcznika systemu Solaris na stronie firmy Oracle), więc to przenośne rozwiązanie. –

+0

Jak mogę wkleić pliki obok siebie, bez odstępu? tj. Użyj "paste -d" "plik1.txt plik2.txt" - bez ogranicznika przestrzeni? - Z góry dziękuję! –

4

to Perl jedna wkładka będzie displa y zmienia nazwę niezbędną

perl -e 'open $f[$_-1], "file$_.txt" for 1,2; print "rename @n\n" while chomp(@n = map ''.<$_>, @f)' 

Jeśli to działa dla Ciebie następnie zastąpić oświadczenie print z prawdziwym zmiany nazwy i użyć

perl -e 'open $f[$_-1], "file$_.txt" for 1,2; rename @n while chomp(@n = map ''.<$_>, @f)' 

zrobić rzeczywista zmiana nazwy

0
paste -d " " file1.txt file2.txt 

Działa doskonale do tej pracy. Ale w przypadku obsługi plików tekstowych w środowisku Windows i korzystania z pasty GNU, należy przekonwertować pliki do formatu Unix (CR) i nie używać plików z (CR-LF).

Powłoka GNU nie obsługuje poprawnie formatów DOS, a parsowanie jest nieprzewidywalne, oczekiwane wyniki są nieprzewidywalne i nieoczekiwane bez ostrzeżeń.

Można użyć gVim przekształcić je łatwo (Edycja/Ustawienia pliku/File Format)

0

Całkowicie niepowiązanych sposoby, aby osiągnąć cel PO za zmiany nazwy plików numerowanych:

for f in {1..5}; do mv /etc/port$d-192.9.200.1-255.555.255.0 /etc/port$d-192.90.2.1-255.555.0.0; done 

Inną możliwością oparciu o rename

rename 's/192.9.200.1/192.90.2.1/' /etc/port[1-5]-192.9.200.1-255.555.255.0 
0

komenda

paste file1 file2 

wyjście

/etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 
/etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 
/etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 
/etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 
/etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0