Чтение номеров из файла управления и извлечение совпадающих номеров строк из файла данных

У меня есть файл управления – cntl.txt

2 3 5 

Файл данных – data.txt

 red blue yellow green violet orange 

Мне нужно прочитать строки, соответствующие файлу управления, здесь ожидаемый результат:

 blue yellow violet 

  • sed удалить все, кроме первой и последней строки из многих файлов
  • введите значение $ LINE вместо «$ LINE»
  • Заменить 1-й с 1), 2-й с 2), ... в GNU Sed
  • Используя sed, добавьте строки линии X выше соответствия
  • Gedit или другой редактор без командной строки с возможностью проверки орфографии на двух языках одновременно
  • Как распечатать последнее слово, которое содержит разделитель поля
  • sed, получив ошибку: sed: unterminated {
  • В POSIX sed период (точка) соответствует новой строке в многострочном пространстве шаблонов?
  • 5 Solutions collect form web for “Чтение номеров из файла управления и извлечение совпадающих номеров строк из файла данных”

    Пример очень неэффективного решения:

     for i in $(<control.txt); do awk -vc=$i 'NR~c{ print $0 }' data.txt; done; 

    Я сообщаю также хорошее решение, которое я узнал сегодня вечером:

     awk 'FNR==NR{ z[$0]++;next }; FNR in z' control.txt data.txt 

    Использование только указанных POSIX функций Sed:

     sed -n -e "$(sed '/./s/$/p/' cntl.txt)" data.txt 

    Конечно, если в файле cntl.txt есть строки, кроме номеров, вы можете получить сообщение об ошибке. Но если у него есть пустые строки, они будут обрабатываться правильно (т.е. они не будут влиять на выход).

    Попробуй это:

     join <(nl data.txt|sort -k1b,1) <(cat cntl.txt|sort -k1b,1) | sort -nk1,1 | cut -d' ' -f2- 

    nl – перечислит строки для вас

      1 red 2 blue 3 yellow 4 green 5 violet 6 orange 

    | sort -k1b, 1 – сортирует их по номеру строки (первое поле), лексикографически

    cat cntl.txt | sort -k1b, 1 – сортирует файл управления в том же порядке

     2 3 5 

    join <() <() – присоединится к отсортированным (и пронумерованным) «данным» с отсортированным «контролем» в первом поле (то есть номере строки)

     2 blue 3 yellow 5 violet 

    | sort -nk1,1 – будет повторно сортировать результаты численно (чтобы вернуть строки в порядок)

    | cut -d '' -f2- – отбросит поле номера строки

     blue yellow violet 

    Только с sed :

     sed -n "$(sed -e 's/$/p;/' < cntl.txt)" data.txt 

    Другое возможное решение:

     IFS=$'\n' read -d '' -r -a colors < 'data.txt'; unset IFS; for i in $(<cntl.txt); do echo ${colors[i-1]} done 

    Линия IFS устанавливает внутренний разделитель файлов как новую строку и вставляет каждую строку из data.txt в массив. После этого вы перебираете строки в cntl.txt и печатаете элементы массива с заданным индексом из него (минус 1, потому что вы начинаете свой data.txt с 1, а не с 0, иначе это было бы необязательно).

    Interesting Posts

    Просмотреть расширенный ACL для файла с '+' в ls -l output

    Awk: if и условное выражение в том же блоке

    Программа оболочки, которая считывает строки и выходные строки с номерами строк

    Предотвращение разрыва соединения NFS от замораживания клиентской системы

    "-bash: 1: команда не найдена" при оценке> 2 & 1

    Порядок выполнения аргументов команды touch

    Как проверить, запущен ли клиент удаленного rsyslog

    Приложения Qt имеют крошечные шрифты на XFCE

    Сообщите мне, когда завершено извлечение RAR-архива (с помощью unar через пользовательское действие Thunar)

    arch linux, x220, SD-кард-ридер

    Отключить клавиши действия

    nemo: Контекстное меню Действие Запуск сценария, который заставляет выбранную символическую ссылку быть относительной

    Найти все .php-файлы внутри каталогов с доступными для записи разрешениями

    Почему «xargs bash -ic echo» не то же самое, что «xargs echo» или «xargs»?

    Как шифровать файловую систему F2FS?

    Linux и Unix - лучшая ОС в мире.