Объединение двух файлов общим столбцом

Для gzip лучше напечатать вывод диагностики в stderr, иначе вы не сможете отличить диагностику от данных (в случае-c).

Каждая программа может посылать свои сообщения куда угодно; gzip отправляет их в stderr

1060     /* Display statistics */
1061     if(verbose) {
1062         if (test) {
1063             fprintf(stderr, " OK");
1064         } else if (decompress) {
1065             display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
1066         } else {
1067             display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
1068         }
1069         if (!test && !to_stdout)
1070           fprintf(stderr, " -- %s %s", keep ? "created" : "replaced with",
1071                   ofname);
1072         fprintf(stderr, "\n");
1073     }

Обходным путем может быть работа с каждой утилитой на ее собственных условиях и ожидание определенного сообщения gzip на stderr или опущение опции -v.

0
20.02.2020, 21:46
4 ответа

Попробуйте это,

Поскольку файл отсортирован, мы можем напрямую использовать команду join

 join  Second First | cut -f2- -d' '

hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

если не отсортировано, используйте код ниже:

join  <(sort second) <(sort first) | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
4
28.04.2021, 23:22

Это должно быть довольно просто с awk, где вы можете обработать второй файл, чтобы использовать только первый столбец, а затем использовать первый файл для его заполнения.

awk 'FNR == NR { map[$1] = $2; next } ($1 in map) { $1 = map[$1] }1 ' second first
4
28.04.2021, 23:22

Другой joinподход, использующий встроенные возможности соединения:

$ join -o 2.2,1.2,1.3,1.4,1.5  <(sort file1) <(sort file2)
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

-oпозволяет указать выходной формат. Здесь мы указываем joinиспользовать второе поле файла 2 (2.2), затем первое, второе, третье, четвертое и пятое поля файла 1(1.2,1.3,1.4,1.5).

0
28.04.2021, 23:22

Использование вставки.

paste <(cut -d ' ' -f2- file2) <(cut -d ' ' -f2- file1)

Использование оболочки.

while IFS= read -r file2 <&3; do 
  IFS= read -r file1
  printf '%s %s\n' "${file2##* }" "${file1#* }"
done 3<file2 <file1

Предостережения

  • Оба несортированные, и оболочка работает медленно, когда речь идет о больших файлах/данных.

  • Paste не имеет отступа, а имеет прямой формат.

0
28.04.2021, 23:22

Теги

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