Объединение двух текстовых файлов с несколькими ключами

Flash больше не требуется, если вы используете Firefox или Chromium. (Это не совсем так, как на момент написания этой статьи, но просто для того, чтобы быть ясным)

Однако, недавно, выпустив Chromium и приземлившись на странице Pandora, он попросил меня установить Flash. (Huh ?!) Зная, что Pandora некоторое время поддерживает интерфейс воспроизведения HTML5 sans Flash [как я обычно пользуюсь этой версией через Firefox с большим успехом], я сделал следующие шаги:

расширение коммутатора агента, измененное на профиль для «Firefox on Ubuntu», перезагрузило страницу Pandora & amp; войдите в систему, когда музыка начинает воспроизводиться с измененного пользовательского агента до значения по умолчанию, Pandora продолжает играть

FWIW, альтернатива командной строки также доступна для прослушивания Pandora под названием pianobar

2
задан 30 March 2018 в 08:20

6 ответов

Возможно, вы сможете сделать это с помощью join, если вы объедините первые два поля в один ключ, заменив разделитель запятой символом, который, как вы можете быть уверенным, не появится в ваших данных. Обратите внимание: поскольку join требует, чтобы данные были отсортированы в поле объединения, это будет работать, только если это не изменит лексический порядок данных.

Например:

3
ответ дан 22 May 2018 в 11:42
  • 1
    Может быть, его можно сортировать в процессе замещения? – muru 30 March 2018 в 16:49
  • 2
    @muru конечно - я не думаю, что это необходимо в этом случае? моя записка о порядке действительно была головоломкой потенциальной проблемы – steeldriver 30 March 2018 в 16:52
  • 3
    Я заполнял нули, чтобы сделать их в лексическом порядке и прекрасно работает. – Sami 2 April 2018 в 22:53

Возможно, вы сможете сделать это с помощью join, если вы объедините первые два поля в один ключ, заменив разделитель запятой символом, который, как вы можете быть уверенным, не появится в ваших данных. Обратите внимание: поскольку join требует, чтобы данные были отсортированы в поле объединения, это будет работать, только если это не изменит лексический порядок данных.

Например:

$ join -t, -a1 -a2 -e0 -o0,1.2,2.2 <(sed 's/,/;/' file1) <(sed 's/,/;/' file2) | sed 's/;/,/' Storm_ID,Cell_ID,Wind_speed,Storm_surge 2,10236258,27,0 2,10236299,0,0.27 2,10236300,58,0.27 2,10236301,25,0.35 2,10240400,0,0.35 2,10240401,0,0.81 3,10240400,51,0 4,10240402,0,0.11
3
ответ дан 17 July 2018 в 17:48

Возможно, вы сможете сделать это с помощью join, если вы объедините первые два поля в один ключ, заменив разделитель запятой символом, который, как вы можете быть уверенным, не появится в ваших данных. Обратите внимание: поскольку join требует, чтобы данные были отсортированы в поле объединения, это будет работать, только если это не изменит лексический порядок данных.

Например:

$ join -t, -a1 -a2 -e0 -o0,1.2,2.2 <(sed 's/,/;/' file1) <(sed 's/,/;/' file2) | sed 's/;/,/' Storm_ID,Cell_ID,Wind_speed,Storm_surge 2,10236258,27,0 2,10236299,0,0.27 2,10236300,58,0.27 2,10236301,25,0.35 2,10240400,0,0.35 2,10240401,0,0.81 3,10240400,51,0 4,10240402,0,0.11
3
ответ дан 23 July 2018 в 18:40

Использование awk и сортировки:

awk -F, -v OFS=, '{x = $1 "," $2} FNR == NR {a[x] = $3; b[x] = 0; next} {b[x] = $3} !a[x] {a[x] = 0} END {for (i in a) print i, a[i], b[i]}' f1 f2 | sort -n
-F, -v OFS=, - установите, что вход и выход будут разделены , {x = $1 "," $2}, сохраните первые два поля, разделенные ,, так как комбинация является общим индексом. FNR == NR {a[x] = $3; b[x] = 0; next} - FNR - номер записи для каждого файла, а NR - общий номер записи в файлах. Они равны для первого файла, поэтому этот блок запускается только для первого файла. Здесь я сохраняю третий столбец первого файла в массиве a и инициализирую соответствующую запись в b равным 0. И затем я перехожу к следующей записи. {b[x] = $3} !a[x] {a[x] = 0} - эти два запускаются для второго файла, сохраняя третий столбец в b, и если в a нет соответствующей записи, установите ее в 0. END {for (i in a) print i, a[i], b[i]}, в конце обоих файлов напечатайте каждая запись, полученная до сих пор

Так как цикл по массивам в awk дает случайный порядок, нам нужно отсортировать вывод в конце с помощью sort -n:

$ awk -F, -v OFS=, '{x = $1 "," $2} FNR == NR {a[x] = $3; b[x] = 0; next} {b[x] = $3} !a[x] {a[x] = 0} END {for (i in a) print i, a[i], b[i]}' f1 f2 | sort -n
Storm_ID,Cell_ID,Wind_speed,Storm_surge
2,10236258,27,0
2,10236299,0,0.27
2,10236300,58,0.27
2,10236301,25,0.35
2,10240400,0,0.35
2,10240401,0,0.81
3,10240400,51,0
4,10240402,0,0.11
5
ответ дан 22 May 2018 в 11:42
  • 1
    P.S Примечание. Это не рекомендуется, если у вас огромный размер файла. Я использовал этот метод с размером файлов до 150 ГБ и 300 ГБ соответственно, и этот метод оказался плохим выбором для такой базы данных. – Sami 2 April 2018 в 22:56
  • 2
    @Sami было бы неплохо упомянуть такие вещи, когда задавали вопрос – muru 3 April 2018 в 00:54

Использование awk и сортировки:

awk -F, -v OFS=, '{x = $1 "," $2} FNR == NR {a[x] = $3; b[x] = 0; next} {b[x] = $3} !a[x] {a[x] = 0} END {for (i in a) print i, a[i], b[i]}' f1 f2 | sort -n -F, -v OFS=, - установите, что вход и выход будут разделены , {x = $1 "," $2}, сохраните первые два поля, разделенные ,, так как комбинация является общим индексом. FNR == NR {a[x] = $3; b[x] = 0; next} - FNR - номер записи для каждого файла, а NR - общий номер записи в файлах. Они равны для первого файла, поэтому этот блок запускается только для первого файла. Здесь я сохраняю третий столбец первого файла в массиве a и инициализирую соответствующую запись в b равным 0. И затем я перехожу к следующей записи. {b[x] = $3} !a[x] {a[x] = 0} - эти два запускаются для второго файла, сохраняя третий столбец в b, и если в a нет соответствующей записи, установите ее в 0. END {for (i in a) print i, a[i], b[i]}, в конце обоих файлов напечатайте каждая запись, полученная до сих пор

Так как цикл по массивам в awk дает случайный порядок, нам нужно отсортировать вывод в конце с помощью sort -n:

$ awk -F, -v OFS=, '{x = $1 "," $2} FNR == NR {a[x] = $3; b[x] = 0; next} {b[x] = $3} !a[x] {a[x] = 0} END {for (i in a) print i, a[i], b[i]}' f1 f2 | sort -n Storm_ID,Cell_ID,Wind_speed,Storm_surge 2,10236258,27,0 2,10236299,0,0.27 2,10236300,58,0.27 2,10236301,25,0.35 2,10240400,0,0.35 2,10240401,0,0.81 3,10240400,51,0 4,10240402,0,0.11
5
ответ дан 17 July 2018 в 17:48

Использование awk и сортировки:

awk -F, -v OFS=, '{x = $1 "," $2} FNR == NR {a[x] = $3; b[x] = 0; next} {b[x] = $3} !a[x] {a[x] = 0} END {for (i in a) print i, a[i], b[i]}' f1 f2 | sort -n -F, -v OFS=, - установите, что вход и выход будут разделены , {x = $1 "," $2}, сохраните первые два поля, разделенные ,, так как комбинация является общим индексом. FNR == NR {a[x] = $3; b[x] = 0; next} - FNR - номер записи для каждого файла, а NR - общий номер записи в файлах. Они равны для первого файла, поэтому этот блок запускается только для первого файла. Здесь я сохраняю третий столбец первого файла в массиве a и инициализирую соответствующую запись в b равным 0. И затем я перехожу к следующей записи. {b[x] = $3} !a[x] {a[x] = 0} - эти два запускаются для второго файла, сохраняя третий столбец в b, и если в a нет соответствующей записи, установите ее в 0. END {for (i in a) print i, a[i], b[i]}, в конце обоих файлов напечатайте каждая запись, полученная до сих пор

Так как цикл по массивам в awk дает случайный порядок, нам нужно отсортировать вывод в конце с помощью sort -n:

$ awk -F, -v OFS=, '{x = $1 "," $2} FNR == NR {a[x] = $3; b[x] = 0; next} {b[x] = $3} !a[x] {a[x] = 0} END {for (i in a) print i, a[i], b[i]}' f1 f2 | sort -n Storm_ID,Cell_ID,Wind_speed,Storm_surge 2,10236258,27,0 2,10236299,0,0.27 2,10236300,58,0.27 2,10236301,25,0.35 2,10240400,0,0.35 2,10240401,0,0.81 3,10240400,51,0 4,10240402,0,0.11
5
ответ дан 23 July 2018 в 18:40
  • 1
    P.S Примечание. Это не рекомендуется, если у вас огромный размер файла. Я использовал этот метод с размером файлов до 150 ГБ и 300 ГБ соответственно, и этот метод оказался плохим выбором для такой базы данных. – Sami 2 April 2018 в 22:56
  • 2
    @Sami было бы неплохо упомянуть такие вещи, когда задавали вопрос – muru 3 April 2018 в 00:54

Другие вопросы по тегам:

Похожие вопросы: