jak scalić dwa pliki konsekwentnie linia po linii

Mam dwa pliki ( file1.txt & file2.txt ), pliki są tylko przykładami .

Jak połączyć dwa pliki, aby utworzyć plik - merge_files.txt jako przykład 3

Piszę teraz skrypt ksh, więc scalanie może być wykonane za pomocą KSH,awk,sed, perl one liner ...etc

Tło-dlaczego muszę scalić pliki: moim celem jest zmiana nazwy starego pliku (exist w pierwszym polu) na nowy plik (exist 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ład4 (merge_files.struktura txt)

 first field                           second field

 OLD file                              NEW file
Author: Adrian Frühwirth, 2013-05-06

5 answers

Możesz użyć paste do formatowania plików 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 chciałbyś dorzucić kilka kontroli bezpieczeństwa ([ -f "${from}" ], ...).

Zastrzeżenie: działa tylko wtedy, gdy w nazwach plików nie ma spacji.

 98
Author: Adrian Frühwirth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-06 08:03:36

Ten jednowierszowy Perl wyświetli niezbędne zmiany nazw

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

Jeśli to działa, zastąp print instrukcją real rename i użyj

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

Aby dokonać rzeczywistej zmiany nazwy

 4
Author: Borodin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-06 07:58:25
paste -d " " file1.txt file2.txt
Świetnie nadaje się do tej pracy. Ale jeśli używasz plików tekstowych w środowisku Windows i używasz GNU paste, upewnij się, że przekształcisz pliki do formatu Unix (CR) i nie używaj plików z (CR-LF).

Wydaje się, że GNU paste nie obsługuje poprawnie formatów DOS, a parsowanie jest nieprzewidywalne, oczekiwane wyjście jest nieobliczalne i nieoczekiwane bez ostrzeżeń.

Możesz użyć GVIM, aby łatwo je przekształcić (Edycja/Ustawienia pliku/Format pliku)

 2
Author: migs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 01:28:24

Całkowicie niepowiązane sposoby osiągnięcia celu OP, jakim jest zmiana nazw numerowanych plików:

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

Inna możliwość oparta na rename

rename 's/192.9.200.1/192.90.2.1/' /etc/port[1-5]-192.9.200.1-255.555.255.0
 0
Author: Vincent Fourmond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 11:22:19

Polecenie

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
 0
Author: user8854776,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 13:50:36