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

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

2 3 5 

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

 red blue yellow green violet orange 

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

 blue yellow violet 

  • Извлечь начальное и конечное положение общего идентификатора
  • Замените новые строки char (^ M) во всех файлах, а затем переименуйте файл на основе строки char
  • удалите строки, содержащие диапазон IP из определенного столбца, делая исключения в диапазоне
  • Попытка grep url из источника html в .txt-файле с помощью sed
  • вставка в строку с помощью sed
  • Сложная команда sed с AND / OR / NOT
  • изменить конкретный столбец с помощью sed или awk
  • Posix Character Устанавливает разницу между ] и ]?
  • 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

    patsplit vs раскол в gawk

    В Centos, где хранятся файлы конфигурации по умолчанию или глобальные tmux-конфигурации?

    Как я могу прочитать жесткий диск Linux из Windows?

    Thinkpad отключить TrackPoint

    Что делает Linux по-другому, что позволяет мне удалять / заменять файлы, в которых Windows будет жаловаться на файл, который в настоящее время используется?

    Переносная однобайтная в каждой строке шестнадцатеричный дамп

    Как я могу исправить Linux-диск без его размонтирования?

    ext4: Как учесть пространство файловой системы?

    Использование дополнительных / менее общих ресурсов NFS для просмотра больших файлов

    Сделать ошибки при компиляции hulahop

    Если PATH содержит $ HOME / mydir и добавляет его, если нет (все в скрипте)

    Список пакетов в группе пакетов на CentOS 7

    Удалите новую строку перед `/ etc / issue` в tty

    Как обменивать целые html-блоки в нескольких файлах с помощью sed

    Почему перенаправление STDERR на / dev / null выполняется таким образом?

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