Слияние двух отсортированных файлов на основе сортировки значений в одном поле

Я считаю, что проблема в том, что когда сеанс SSH закрыт ( нажатие ctrl-c или закрытие xterm), процессу отправляется HUP. Чтобы выполнить ветвление процесса в фоновом режиме, добавьте & , а для блокировки hup используйте nohup :

ssh (hidden) 'nohup sleep 300> / dev / null 2> / dev / null

SSH должен запуститься, и процесс будет выполняться на example.com в фоновом режиме.

Если вы хотите отслеживать его прогресс, вы можете использовать screen , если вы хотите это сделать, то поможет что-то похожее на это:

ssh (hidden) -t 'screen -D - RR -S this / bin / sleep 300 '

Это создает сеанс экрана с именем' this '(-S), отсоединяет уже работающий экран, если он подключен в другом месте, и снова подключается сюда. Затем запускает / bin / sleep с 5-минутным ожиданием.

1
01.12.2016, 05:50
3 ответа

awk и join не подходят для этого.

sed '/^$/q' file1; sort -snmk2,2 <(sed '1,/^$/d' file1) <(sed '1,/^$/d' file2)
1
27.01.2020, 23:34

С современным (версия > 4. 0) GNU awk, вы могли бы

awk '
  FNR>4 {a[$0]=$2; next}; 
  NR==FNR; 
  END {
    PROCINFO["sorted_in"] = "@val_num_asc"; 
    for (i in a) print i;
  }
' file1 file2

Пояснение:

  • FNR>4 {a[$0]=$2; next}; создать массив полей сортировки не-заголовочных строк
  • NR==FNR; оценивает TRUE только для первого файла, и достигается только для FNR>4, вызывая печать заголовочных строк для первого файла
  • PROCINFO["sorted_in"] = "@val_num_asc" отсортировать массив по значению (т.е. по хранимому полю $2)
  • for (i in a. т.е. сохраненное поле $2)
  • for (i in a) print i print indices сортированного массива (которые являются сохраненными строками без заголовков)

Тестирование

$ awk 'FNR>4 {a[$0]=$2; next}; NR==FNR; END {PROCINFO["sorted_in"] = "@val_num_asc"; for (i in a) print i;}' file1 file2
header 1
header 2
header 3

lemur    3    dd
cat    4    aa
alligator    4    ca
dog    5    ab
ostrich    10    cd
fish    13    cc
lemming    16    ad
1
27.01.2020, 23:34

Использование оболочки с заменой процесса (ksh93, bash,...)(см. конец для замены процесса -бесплатная альтернатива):

cat <( head -n 3 file1 ) \
    <( sort -k2,2n <( tail -n +4 file1 | tr -s ' ' '\t' ) \
                   <( tail -n +4 file2 | tr -s ' ' '\t' ) | uniq )

Это приведет к:

header 1
header 2
header 3

lemur   3       dd
alligator       4       ca
cat     4       aa
dog     5       ab
ostrich 10      cd
fish    13      cc
lemming 16      ad

Команда объединяет строки заголовков file1с результатом операции сортировки. Сортировка выполняется численно по второму полю некоторого ввода, и любые повторяющиеся строки (аллигаторы, лемуры и лемминги )удаляются с uniqиз результата.

Входными данными для сортировки будет заголовок -за вычетом содержимого как file1, так и file2, пропущенный через trдля замены последовательных пробелов одиночными вкладками (между столбцами было нечетное количество пробелов в примере данных ).

Результатом является табуляция -с разделителями.


Эквивалентный способ с использованием тех же инструментов:

cat <( head -n 3 file1 ) \
    <( sort -k2,2n <( cat <( tail -n +4 file1 ) \
                          <( tail -n +4 file2 ) | tr -s ' ' '\t' ) | uniq )

Без cats и замены процесса:

{ head -n 3 file1;
    { tail -n +4 file1; tail -n +4 file2; } | tr -s ' ' '\t' | sort -k2,2n | uniq; }
0
27.01.2020, 23:34

Теги

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