объединение двух файлов .txt вместе со столбцами данных рядом - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь объединить два текстовых файла вместе с данными, хранящимися в отдельных столбцах в выходном файле merged_file.txt.

file_1:

 Temp[K] Time(s) dT
 314.1 1.2 0.4
 317.4 4.2 0.3
 319.9 7.2 0.5

file_2:

 Temp[K] Time(s) dT
 312.1 1.2 0.2
 315.3 4.2 0.3
 316.7 7.2 0.2

Merged_file:

Temp[K] Time(s) dT Temp[K] Time(s) dT
314.1 1.2 0.4 312.1 1.2 0.2

Я относительно новичок в Unix и оболочке bash, но я провел некоторые исследования и обнаружил paste и pr. Для paste я пытался использовать разделитель ' ', но он не работает.

$ paste -d' ' File_1.txt File_2.txt | column -s $'\t' -t > merged_file.txt 
$ pr -m -t File_1.txt File_2.txt  > merged_file.txt

Данные всегда хранятся друг под другом и не будут работать ни при каких обстоятельствах.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Вы используете column -s $'\t'.Опция -s столбца указывает разделитель, используемый во входном файле.Если у вас есть пробелы во входных файлах и вы используете paste -d' ', оставьте это значение по умолчанию.

$ paste -d' ' File_1 File_2 | column -t
Temp[K]  Time(s)  dT   Temp[K]  Time(s)  dT
314.1    1.2      0.4  312.1    1.2      0.2
317.4    4.2      0.3  315.3    4.2      0.3
319.9    7.2      0.5  316.7    7.2      0.2
0 голосов
/ 22 марта 2019

Вы можете использовать awk и встроенную переменную FILENAME, чтобы прочитать каждый из файлов в массив и затем вывести их бок о бок, используя блок END.Вы можете использовать простую проверку if ($0 == "") для проверки и удаления пустых строк.

Например, когда ваши данные находятся в файлах f1 и f2, вы можете сделать:

awk '
    FILENAME=="f1"{if ($0 != "") a[i++] = $0} 
    FILENAME=="f2"{if ($0 != "") b[j++] = $0} 
    END {for (k = 0; k < i; k++) print a[k], b[k]}' f1 f2

Пояснение

  • FILENAME=="f1"{if ($0 != "") a[i++] = $0}, если файл f1, а строка не пустая, считать его в массив a[];
  • То же самое для файла f2, но считывание в массив b[];
  • END {for (k = 0; k < i; k++) print a[k], b[k]} после обработки всех строк в обоих файлах, цикл i раз печатая содержимое a[] и b[]массивы, разделенные пробелом (можно добавить дополнительную проверку, чтобы гарантировать i == j)

Пример использования / Вывод

$ awk '
>     FILENAME=="f1"{if ($0 != "") a[i++] = $0}
>     FILENAME=="f2"{if ($0 != "") b[j++] = $0}
>     END {for (k = 0; k < i; k++) print a[k], b[k]}' f1 f2
Temp[K] Time(s) dT Temp[K] Time(s) dT
314.1 1.2 0.4 312.1 1.2 0.2
317.4 4.2 0.3 315.3 4.2 0.3
319.9 7.2 0.5 316.7 7.2 0.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...