Циклично выполните список через awk

  • Emacs/Vim/Eclipse/... - Лично я - пользователь Emacs. Если Вы находите, что управляющие последовательности утомляют Ваш мизинец, просто Режим Гадюки это. Emacs так хорошо интегрируется в Unix, делая очень легким управлять всем все от одного места. Vim также делает хорошее задание здесь, но я нахожу, что Elisp намного более мощный дополнительный язык, чем Сценарий Vim. Можно было говорить в течение многих часов обо всех способах создать Emacs для разработки C. Режим Flymake был упомянут и является супер запуском к вещам. Я не знаком с Eclipse, я не нахожу, что он покидает достаточно комнаты на моем экране для кода, и при этом мне не нравится, насколько чрезмерно увеличенный в размерах это (пользователи Vim скажут то же самое о Emacs). Я также незаконно смещаюсь против чего-либо записанного в Java по чисто эстетическим причинам.

  • Ctags - Отмечает Ваш C (или многие другой язык) функции так, чтобы Vim или Emacs или независимо от того, что может сделать определенный гипертекст, связывающийся в Ваших файлах. Скажите, что Вы блуждаете вокруг, и Вы видите функцию, и Вы царапаете голову, говорящую, "Что тот делает снова? Именование немного неопределенно". Перебор доски звона, можно мчаться прямо к, он - определение.

  • Cmake/Gnu-Autotools - Сделайте является большим, но в какой-то момент необходимо абстрагировать вещи немного так, чтобы проект мог создать себя на всех видах систем, на которые у Вас нет способа протестировать. Если Вам только нужны люди для создания кода *, отклоняют, Автоинструменты является большим, но действительно необходимо ознакомиться с Cmake так или иначе. Команды Cmake создают код в каждой мыслимой возможной конфигурации и удостоверяются, что Вы не должны проходить головную боль. Если Вы хотите, чтобы Ваш проект был легко забран, покупают других, один из этих инструментов крайне важен.

  • Git/Mercurial/Subversion/... - Вы могли провести месяцы, исследуя программное обеспечение управления версиями, но необходимо, вероятно, просто пойти с Мерзавцем. Это твердо, это распределяется, $! # %& Ядро Linux прослежен с ним. Если это достаточно хорошо для Linus, это получено, чтобы быть достаточно хорошим для Вас. Я также слышу, что хорошие вещи о Подвижном, по-видимому, G ** gle использует их, таким образом, это, вероятно, не плохо. Некоторым людям, кажется, нравятся Подверсия и CVS и этажерка. Мне не нравятся они, потому что они являются монолитными, чтобы мне очень неудобно и ограничивает.

  • Stumpwm/wmii/XMonad/... - В какой-то момент Вы собираетесь понять, что что-либо, что можно сделать для хранения течения работы, собирается значительно улучшить вывод. Один из лучших способов помешать Вашему мозгу повреждаться это - контекст, должен переключиться на мозаичное размещение, КЛАВИАТУРА УПРАВЛЯЕМЫЕ менеджеры окон. Я - персональный поклонник StumpWM, Emac менеджеров окон. Полностью реализованный в непрерывном настраиваемом процессе языка Common LISP, что-либо, что Вы делаете повторяющимся образом, может быть выслано далеко в функции и связано с командами. Большой материал. Я не знаю много ни об одних из других, но возможно дальнейшую разработку лучше оставляют другому потоку. ИСПОЛЬЗУЙТЕ КЛАВИАТУРУ как можно больше.

  • GDB - Я не знаком с другими отладчиками, но это, кажется, фактический стандарт.

  • Valgrind - Я не знаю ни о чем больше, что делает то, что это так успевает. Valgrind крайне важен для всех тех противных поисков на профилирование/утечку памяти, на которые Вы хотите пойти. Вы просто не можете написать код с malloc/calloc без Valgrind.

2
16.12.2018, 06:18
3 ответа

Это встречает порядок Вашего желаемого вывода:

$ awk -F, '
    NR == FNR {field1[$0] = $1; next}
    {
      for (line in field1) 
        if (line ~ $0) 
          print field1[line]
    }
  ' data.csv list.txt 
"The Mike"
"John"
"Johnny"
"Lizard"
"Johnny"

Это читает data.csv файл в память, отображая целую строку на field1. Затем каждая строка файла list.txt проверяется по каждому элементу массива field1.

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

$ awk -F, '
    NR == FNR {list[$1]; next}
    {
      for (item in list) 
        if ($0 ~ item) 
          print $1
    }
  ' list.txt data.csv 
"John"
"The Mike"
"Lizard"
"Johnny"
"Johnny"
3
27.01.2020, 21:55
  • 1
    Что, если оба файла являются очень большими? Это просто, какой бы ни больше? –  Julien 09.03.2011, 08:34
  • 2
    Здорово, теперь что, если я только хотел, чтобы это соответствовало началу строк в data.csv? –  Julien 09.03.2011, 08:52
  • 3
    @Julien, это могло бы работать на Вас также: grep -f list.txt data.csv | cut -d, -f1, но Вы только получаете "Johnny" однажды. Это - более легкий конвейер, но я не могу сказать, отвечало ли это Вашим требованиям. –  glenn jackman 09.03.2011, 19:35
#!/bin/bash

 while read -r line; do 
   awk -F '^"|","|"$' '$0 ~ line{print $2}' line="$line" data.csv
 done < list.txt

Подтверждение концепции

$ while read -r line; do awk -F '^"|","|"$' '$0 ~ line{print $2}' line="$line" data.csv; done < list.txt
The Mike
John
Johnny
Lizard
Johnny

Этот разделитель полей имеет дело со встроенными кавычками и/или запятыми

2
27.01.2020, 21:55
  • 1
    Это не печатает второго Johnny в моей системе... Я не уверен почему. –  Julien 09.03.2011, 08:26

Я не совсем ясен на том, что Вы пытаетесь сделать: заменить ЭЛЕМЕНТ СПИСКА какой? Просто ища соответствие где-нибудь и производя первое поле? Кроме того, Ваш пример list.txt кажется, соответствует где угодно в строке, которая могла потенциально быть проблематичной: что, если list.txt в какой-то момент содержит строку e? Это соответствовало бы всем кроме последней строки Вашего образца data.csv.

awk -F '^"?|"?,"?|"$?' 'BEGIN {
                          # read list.txt into an array
                          while (getline pat < "list.txt") {
                            pats[pat] = 1
                          }
                          close("list.txt")
                        }
                        {
                          # skip empty field before leading "
                          if ($1 == "") {
                            res = $2
                          } else {
                            res = $1
                          }
                          # scan record for patterns stored earlier,
                          # output the first real data field (res) if
                          # found
                          for (pat in pats) {
                            if ($0 ~ pat) {
                              print res
                            }
                          }
                        }' data.csv

Это немного более сложно, чем это могло быть; Ваш разделитель полей не имеет дело с дополнительной ведущей кавычкой на первом поле или дополнительным запаздыванием один на последнем поле. Мой делает, но по цене, которая, если это - там первое поле, будет пуста (пустая строка прежде ^"?). Это также не пытается иметь дело со встроенными кавычками. Специализированный синтаксический анализатор CSV был бы лучшей идеей, если необходимо поддерживать случайный обобщенный CSV.

1
27.01.2020, 21:55
  • 1
    я вижу почему, теперь, после чтения glenn ответ jackman –  Julien 09.03.2011, 08:35
  • 2
    @Julien: Ваше предложенное редактирование должно было быть комментарием. Отправьте его как комментарий здесь, если у Вас все еще есть вопрос об ответе geekosaur. –  Gilles 'SO- stop being evil' 09.03.2011, 22:42

Теги

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