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

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

2 3 5 

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

  • Утверждение awk sed if
  • Сравнение шаблонов внутри awk
  • Найти число FN с awk
  • Преобразование GB в TB в скрипт
  • Слияние дублированных строк, которые имеют одинаковые первые три поля
  • Согласование и вставка в линию
  •  red blue yellow green violet orange 

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

     blue yellow violet 

  • Используйте sed для замены текста и вывода на новую строку, а также распечатайте его
  • как конкатенировать следующую строку, когда условие истинно awk
  • sed string для точного соответствия, содержащего /
  • Цифры с нулевым заполнением до 2 цифр с помощью sed
  • gensub на нескольких линиях
  • Как удалить все строки, которые имеют одно значение в строке?
  • 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 - лучшая ОС в мире.