Скопируйте столбцы файла, чтобы указать c расположение другого файла с разделителями каналов - PullRequest
0 голосов
/ 06 августа 2020

У меня есть файл, который предположим, что xyz.dat содержит данные, как показано ниже -

a1|b1|c1|d1|e1|f1|g1
a2|b2|c2|d2|e2|f2|g2
a3|b3|c3|d3|e3|f3|g3

Из-за некоторых требований я создаю два новых файла (также известные как m.dat и o.dat) из исходного xyz .dat. M.dat содержит столбцы 2 | 4 | 6, как показано ниже, после запуска на нем некоторых logi c -

b11|d11|f11
b22|d22|f22
b33|d33|f33

O.dat содержит все столбцы, кроме 2 | 4 | 6, как показано ниже, без каких-либо изменений в it -

a1|c1|e1|g1
a2|c2|e2|g2
a3|c3|e3|g3

Теперь я хочу объединить файлы M и O, чтобы восстановить исходный формат файла xyz.dat.

a1|b11|c1|d11|e1|f11|g1
a2|b22|c2|d22|e2|f22|g2
a3|b33|c3|d33|e3|f33|g3

Обратите внимание, что положение столбцов может измениться для другого файла . Я получу позиции столбцов, как в приведенном выше примере, это 2,4,6, поэтому мне нужна некоторая команда generi c для запуска в l oop, чтобы объединить новый файл M и O или одну команду, в которой я могу передать столбцы позиции, и он скопирует столбцы из файла M.dat и вставит их в файл O.dat.

Я пробовал вставить, sed, вырезать, но не смог сделать идеальную команду.

Пожалуйста помощь.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Чтобы выполнить слияние двух файлов по столбцам, лучше использовать скриптовый движок (Python, Awk или Perl или даже bash). Такие инструменты, как paste, sed и cut, не обладают достаточной гибкостью для этих задач (соединение может приблизиться, но потребует дополнительной работы).

Рассмотрим следующий сценарий на основе awk

awk -vOFS='|' '-F|' '
{
    getline s < "o.dat"
    n = split(s. a)
    # Print output, Add a[n], or $n, ... as needed based on actual number of fields.
    print $1, a[1], $2, a[2], $3, a[3], a[4]
}
' m.dat

Строку print можно настроить для генерации любого порядка столбцов

0 голосов
/ 08 августа 2020

Основываясь на пояснении OP, похоже, цель такова: при вводе двух файлов и списке столбцов, в которых данные должны быть объединены из 2-го файла, создать выходной файл, содержащий данные слияния.

Например:

   awk -f mergeCols COLS=2,4,6 M=b.dat a.dat

   # If file is marked executable (chmod +x mergeCols)
   mergeCols COLS=2,4,6 M=b.dat a.dat

Будет вставлять столбцы из b.dat в столбцы 2, 4 и 6, тогда как другой столбец будет включать данные из a.dat

Реализация с использованием awk: (создать файл mergeCols).

#! /usr/bin/awk -f
BEGIN {
    FS=OFS="|"
}
NR==1 {
    # Set the column map
    nc=split(COLS, c, ",")
    for (i=1 ; i<=nc ; i++ ) {
        cmap[c[i]] = i
    }
}
{
    # Read one line from merged file, split into tokens in 'a'
    getline s < M
    n = split(s, a)
    # Merge columns using pre-set 'cmap'
    k=0
    for (i=1 ; i<=NF+nc  ; i++ ) {
        # Pick up a column
        v = cmap[i] ? a[cmap[i]] : $(++k)
        sep = (i<NF+nc) ? "|" : "\n"
        printf "%s%s", v, sep
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...