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

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

2 3 5 

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

 red blue yellow green violet orange 

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

 blue yellow violet 

  • Использование здесь-doc для `sed` и файла
  • Возвращайте только часть строки после соответствующего шаблона
  • Добавить строку, используя Sed на удаленной системе
  • Заменить символ, кроме последних x входов
  • Искать значение только в одном столбце wo с помощью awk, sed или perl
  • Использование 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, иначе это было бы необязательно).

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