Об’єднайте чергові рядки з двох файлів


9

Файл1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

Файл2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

Вихідний файл:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
Будь ласка, завжди вказуйте свою операційну систему. Багато стандартних інструментів по-різному поводяться на різних ОС, тому нам потрібно знати, що ви використовуєте.
тердон

Відповіді:




5

pasteРішення є портативним і найефективнішим. Я згадую про цю альтернативу лише в тому випадку, якщо ви віддаєте перевагу її поведінці у випадку, коли два файли не мають однакової кількості рядків:

З GNU sed:

sed Rfile1 file2

Якщо file1має менше рядків, ніж file2тоді, коли file1він вичерпаний, sedвін не виведе нічого для нього (на відміну від порожніх рядків для paste).

Якщо у file1них більше рядків file2, то додаткові рядки будуть відкинуті (на відміну від друку порожніх рядків для file2з paste).

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

Використовуючи awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNRузгоджується лише у тому випадку, якщо номер поточного запису дорівнює поточному номеру запису файлу (отже, він узгоджується лише під час обробки першого файлу): зберігає оброблюваний в даний час запис в масив xз індексом, рівним поточному номеру запису файлу, і пропускає поточний запис
  • {print x[FNR]"\n"$0}: друкує вміст масиву xз індексом, рівним номеру запису поточного файлу з наступним новим рядком та змістом поточного запису
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

Це дає вихід, але не зовсім такий, як я хотів. Рядки tid.info надходять після рядків tid.setnr у моєму вихідному файлі.
pmaipmui

@Nainita Це ви показуєте у своєму прикладі.
kos

@Nainita Так чи інакше, щоб змінити порядок виводу, ви можете просто переключитися file1і file2в команді.
kos

Так ... я зробив те саме, але друкував саме так, як раніше. після друку tid.setnr тоді він друкував tid.info.
pmaipmui

1
@mikeserv Однак, оскільки я був у нього, я mawkтакож спробував , і він працює і на ньому. У всякому разі бути розумним , я не можу зрозуміти , чому він не повинен працювати тільки навпаки (тобто тільки шляхом перемикання файлів). Справа не в тому, awkщо вхід, рядки - це рядки. Якби щось не підтримувалося його версією, воно б просто вперше зламалося. Простіше, просто ОП помилився при переключенні вхідних файлів в аргументи.
kos

-1

Найпростіше рішення подано нижче.

cat file1 >> file2

або

cat file2 >> file1

1
sachin, прочитайте запитання ще раз; це додає вміст одного файлу до вмісту іншого файлу. Він не об'єднує файли, що чергуються з рядками (так, один рядок, file1потім один рядок file2і так далі ...)
don_crissti
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.