Получить или отфильтровать повторяющиеся строки по столбцу

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

Другие варианты:

  • Каким-то образом получить последовательную консоль и надеяться, что оболочка для входа в систему доступна. Затем используйте expect, чтобы дождаться появления консоли и выполнить команды, которые вы вводите вручную. (В QEMU это можно сделать, я понятия не имею, как с этим справляется VBox.)
  • Создайте небольшой диск, содержащий ваш скрипт и зависимости. Затем все, что вам нужно ввести, это что-то вроде:

    mount /dev/sdb1 /mnt && /mnt/script.sh
    
  • Убедитесь, что в вашей виртуальной машине есть подключение к локальной сети, и сделайте что-то вроде:

    curl 192.168.56.1 | sh
    

Установочные носители некоторых дистрибутивов считывают URL конфигурации из командной строки ядра. За подробностями обратитесь к документации вашего дистрибутива.

3
21.05.2015, 09:24
3 ответа

Ответ @rici правильный, но обратите внимание, что -Dявляется расширением GNU

Вот awk-решение. Он выполняется за один проход, но сохраняет предыдущую строку:

sort -k3n <file name> | awk 'a[$3]++{ if(a[$3]==2){ print b }; print $0}; {b=$0}'
0
27.01.2020, 21:16
gawk -F'= ' '{d[$2][a[$2]++]=$0} END{for (i in a) {if (a[i] > 1) for (j in d[i]) {print d[i][j]}}}'

Пояснение:

Для каждой строки ($0 )возьмите второе поле ($2 ), разделенное символом '=', и используйте это поле как ключ к хэшу 'a' для подсчета вхождений этого поля, а также используйте это поле в качестве ключа первого измерения для двумерного -хэша 'd', а значение хэша 'a', на которое ссылается это поле, в качестве ключа второго измерения для хранения значения текущей строки ($ ). В конце перебираем все элементы 'a' со значениями больше единицы (означает дублирование )и вывод соответствующих значений 'd'.

ПРИМЕЧАНИЕ. :Этот один вкладыш не требует сортировки, но потребляет память.

0
02.12.2020, 05:52

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

awk 'NR==FNR{c[$NF]++;next} c[$NF]>1' input.txt input.txt

Ваш входной файл будет обработан дважды.

  • В первый раз (, когда NR, глобальный счетчик строк, равен FNR, счетчику -строк файла ), мы просто увеличиваем счетчик последнего поля в строке (переменная массива c, с последним значением поля как «индекс массива» ), и немедленно пропустить выполнение.
  • Во второй раз мы достигаем условия c[$NF]>1за пределами блока правил. awkвсегда будет печатать текущую строку, включая все возможные изменения, сделанные до сих пор, если она встречает условие, оцениваемое как trueза пределами блока правил. В этом случае будет напечатана текущая строка, если количество вхождений для последнего поля больше 1 (, т. е. это повторяющееся вхождение ).

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

KOKOKO= 5 

в вашем примере ввод может быть интерпретирован как имеющий только два столбца, в зависимости от того, как именно вы определяете «столбец».

0
02.12.2020, 08:08

Теги

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