Сравнение файлов bash по строке с выбранной строкой

uname - это команда, которая должна быть введена в командной строке. Поэтому, если вы открываете терминал и набираете uname, он выдает слово Linux. В упомянутой вами команде вы найдете -r. Это вариант uname. Он инструктирует uname распечатать номер выпуска ядра. Поэтому он будет в основном распечатывать некоторые цифры (например, 3.2.0-41-amd64).

Вы должны ввести команду

sudo apt-get install linux-headers-$(uname -r) build-essential

, как она написана. [F8] сообщает вашей командной строке (лучшее слово будет shell), чтобы выполнить команду something и вставить вывод этой команды.

Итак, в вашем случае uname (при условии, что число, которое я написал правильно, что может быть не в вашем случае), команда, которая выполняется, - sudo apt-get install linux-headers-3.2.0-41-amd64 build-essential. В основном вы можете просто искать версию ядра и вставлять ее вручную.

Как вы теперь видите, ни одна из ваших версий не является правильной. Решение выглядит несколько иначе.

1
задан 24 March 2014 в 02:54

2 ответа

Это считывает все строки в a.txt и отслеживает все значения столбца 2. Затем он читает b.txt и печатает любые повторяющиеся значения столбца 2:

$ awk 'NR==FNR {seen[$2]=1; next} seen[$2]==1 {seen[$2]++; print $2}' a.txt b.txt
abcd
2dfg

Команда awk может быть разделена на две части. Первая часть:

NR==FNR {seen[$2]=1; next}

awk сначала проверяет, совпадает ли общее количество обработанных записей (строк), NR, с количеством записей, обрабатываемых в этом файле, . Это верно только для первого обработанного файла, который в этом случае является a.txt. Таким образом, для каждой строки из a.txt ассоциативный массив seen с ключом, установленным на значение второго столбца, $2, устанавливается в значение 1. Это будет использоваться для указания того, что это значение столбца-2 было «видно» в a.txt. Следующая команда: next, которая сообщает awk пропустить остальные команды и перейти к следующей записи.

Вторая часть:

seen[$2]==1 {seen[$2]++; print $2}

Из-за next в первой части выше, эта часть выполняется только файлом b.txt. Эта часть начинается с теста: он проверяет, было ли значение столбца-2, $2 для этой записи ранее. Если раньше было замечено, то выполняются команды в фигурных скобках. Первая команда в фигурных скобках seen[$2]++ увеличивает значение seen, так что мы больше не будем обрабатывать это значение столбца-2. (Следовательно, повторяющиеся значения столбца-2 игнорируются.) Вторая команда просто печатает значение столбца-2, которое было замечено ранее в a.txt.

Если мы можем верить, что повторений нет значения для столбца 2, возможен более простой сценарий:

$ awk '{print $2}' a.txt b.txt | sort | uniq -d
2dfg
abcd
1
ответ дан 24 May 2018 в 10:29
  • 1
    Это предполагает, что ни один файл не содержит повторяющихся строк. – Sparhawk 24 March 2014 в 06:07
  • 2
    @Sparhawk ОК. Это тоже обрабатывается. – John1024 24 March 2014 в 06:16
  • 3
    Ницца! (Хотя мой awk-fu недостаточно хорош, чтобы понять всю команду.) – Sparhawk 24 March 2014 в 06:19

Следующее однострочное perl выполнит задание:

perl -lane 'BEGIN{%h}$h{$ARGV."\n".$F[1]}++;END{foreach(keys(%h)){s/.*\n//;$f{$_}++};for(keys(%f)){print if$f{$_}>1}}' a.txt b.txt > c.txt
0
ответ дан 24 May 2018 в 10:29

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

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