Поиск списка чисел в столбце другого файла

У меня есть список номеров.

Для каждого числа я хочу найти его в другом файле.

Но я хочу найти его только в 12-м столбце.

Я пробовал много вещей, включая внедрение переменных:

for line in `cat numbers.txt`; do awk -F'|' -v "LINE=$line" '$12~/LINE/' bigfilewithcolumns.txt; done

Возможно ли это с awk?

Какой макет у файла? Каково определение «12-го» столбца: вы имеете в виду столбец, определяемый пользователем, или 12-й символ в любой/каждой строке? Можете ли вы экспортировать файл в формате CSV или JSON?

Martin 27.06.2024 20:03

Не уверен, но пробовали ли вы $12~LINE, как здесь stackoverflow.com/questions/11534173/…

The fourth bird 27.06.2024 20:06

Ой! это работает: for line in `cat numbers.txt`; do awk -F'|' -v "LINE=$line" '$12~LINE' bigfilewithcolumns.txt; done. Итак, только '$12~LINE', обратной косой черты здесь нет. Спасибо!

trogne 27.06.2024 20:14

пожалуйста, обновите вопрос, используя образцы (3-6 строк) из обоих файлов вместе с ожидаемыми результатами; использование цикла bash для многократного сканирования большого файла будет работать плохо; то, что вы описываете, вероятно, (относительно) легко с помощью сценария awk, который выполняет один проход через большой файл (таким образом, с гораздо большей производительностью) ... но нам нужны примеры ваших файлов, чтобы предоставить полезное решение

markp-fuso 27.06.2024 20:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это условие

$12~/LINE/

проверяет, есть ли LINE где-нибудь в столбце номер 12. Также использование регулярного выражения для работы с числом может привести к совпадению для разных чисел, например.

$12~/234/

будет верно не только для 234, но и для 1234, и для 2345, и для 12345, и так далее. Вам следует использовать == равно, если вы хотите ограничить число, равное этому. Я бы улучшил ваш код следующим образом

for line in `cat numbers.txt`
do
  awk -F'|' -v LINE = "$line" '$12==LINE' bigfilewithcolumns.txt
done

ОП не знает, почему мы не читаем строки с, но, вероятно, вам следует.

tripleee 28.06.2024 11:28
Ответ принят как подходящий

Вы не хотите вызывать отдельный awk для каждой строки в числовом файле. awk может обрабатывать несколько файлов:

awk -F'|' '
  NR == FNR { # this condition is only true for the first file
    num[$0] = 1
    next
  }
  $12 in num
' numbers.txt bigfilewithcolumns.txt

awk, вероятно, подходящий для этого инструмент. Для полноты картины: если количество столбцов в bigfilewithcolumns.txt известно и постоянно, и поскольку вас явно не волнует порядок вывода, это также может быть работой для join. Если ваша оболочка bash:

a=( 2.{1..N} )
join -t '|' -o "${a[*]}" -2 12 <( sort numbers.txt ) <( sort -t '|' -k12 bigfilewithcolumns.txt )

где N — количество столбцов в bigfilewithcolumns.txt. Если ваша оболочка не bash, вам нужно будет найти другой способ передать опцию -o 2.1,2.2,...,2.N в join.

Если ваш join — GNU join, вы можете немного упростить:

join -t '|' -o 2.{1..N} -2 12 <( sort numbers.txt ) <( sort -t '|' -k12 bigfilewithcolumns.txt )
-o в присоединении меня всегда раздражало. Использование расширения скобок оболочки — это великолепно!
glenn jackman 28.06.2024 15:32

Спасибо, но не используйте версию с sort -n, это неправильно, и я только что исправил свой ответ, удалив опции -n: join ожидает обычную сортировку, а не числовую.

Renaud Pacalet 28.06.2024 15:57

@jhnc К сожалению, ты прав, это не POSIX. -o $(printf "%s," 2.{1..11})2.12, но менее элегантно.

Renaud Pacalet 30.06.2024 09:05

ты нашел хороший компромисс

jhnc 04.07.2024 15:36

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