Nano Hash - криптовалюты, майнинг, программирование

Сравнить два файла, если совпадение сдвинуто вниз по последним полям (awk)

У меня есть два входных файла (с разделителями табуляции), и мне нужно найти соответствие между ними для $1 && $2, если совпадение только 3-го и 4-го поля будет сдвинуто вниз:

ВВОД: Файл1:

 p1   555  
 p1   557  
 p3   558

Файл2:

p1  323 lololo  aaaa    
p1  555 papapp  kkka    
p1  556 hooho   sssa    
p1  557 jjjlo   kkka    
p3  424 zzzzz   llla    
p3  558 jjjjj   ssss

ВЫХОД:

p1 323  lololo aaaa
p1 555
p1 556  papaapp kkka
p1 557   
p3 424  hooho   sssa
p3 558      
        jjjlo   kkka  

и т.п.

Спасибо

24.08.2015

Ответы:


1

Что-то в этом роде должно работать:

awk 'NR == FNR { to_shift[$1,$2] = 1; next } { queue[++w] = $3 OFS $4 } to_shift[$1, $2] { print $1, $2; next } { print $1, $2, queue[++r] } END { while(r != w) { print OFS OFS queue[++r] } }' file1 file2

То есть:

NR == FNR {                      # while processing the first file (file1)
  to_shift[$1,$2] = 1            # remember which lines to shift
  next                           # and do nothing else
}
{                                # afterwards (processing file2):
  queue[++w] = $3 OFS $4         # queue the next payload fields
}
to_shift[$1, $2] {               # If this is a shift line
  print $1, $2                   # print only the first two fields
  next                           # and do nothing else
}
{                                # otherwise, print the first two fields and
  print $1, $2, queue[++r]       # the next queued payload
}
END {                            # In the end:
  while(r != w) {                # print out what remains in the queue, i.e.
    print OFS OFS queue[++r]     # all that was shifted out at the bottom
  }
}

Я подозреваю, что для форматирования вы можете использовать \t в качестве разделителя выходных полей, и в этом случае вы можете просто передать -v OFS='\t' в awk:

awk -v OFS='\t' 'NR == FNR { to_shift[$1,$2] = 1; next } { queue[++w] = $3 OFS $4 } to_shift[$1, $2] { print $1, $2; next } { print $1, $2, queue[++r] } END { while(r != w) { print OFS OFS queue[++r] } }' file1 file2

Если ввод разделен табуляцией, а поля могут содержать пробелы, также передайте -F '\t', чтобы сделать разделитель полей ввода табуляцией.

24.08.2015
  • Wintermute, спасибо за этот отличный сценарий и комментарий, я ценю это. 24.08.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..