Как передать содержимое файла параметру / параметру функции

У меня есть набор пар .txt файлов. В каждой паре файлов File1 содержит одно целое число, а File2 содержит много строк текста. В сценарии, который я пишу, я хотел бы использовать целое число в File1, чтобы указать, сколько строк должно удалить верхнюю часть File2, а затем записать эти строки в другой файл. Я использую gnu-parallel для параллельной работы с несколькими парами файлов.

Похоже, что простой способ сделать это – передать содержимое файла File1 в качестве параметра для опции -n head – возможно ли это? Я пробовал использовать xargs и cat File1 , но ни один из них не работает.

  • Переменная не расширяется внутри другой переменной bash
  • Вызов cp из BASH и использование опции -u
  • Как повторить команду n раз, а затем выйти?
  • Проверка ошибок в сценарии bash
  • Замена Bash-процесса не работает как «root» на OS X
  • Выход команды сохранения в переменной, если команда включает в себя каналы
  • Пример файла-пары:

     File1: 2 File2: AAA BBB CCC DDD 

    Желаемый результат:

     File3: AAA BBB 

    Если я не использовал gnu-parallel, я мог бы назначить содержимое File1 переменной (хотя я не знаю, могу ли я передать это в опцию -n head ?); однако параллель {} похоже, усложняет этот подход.

    При необходимости я могу предоставить дополнительную информацию.

  • Проверьте в bash, если make сделал что-то
  • Удалить символы строки строки из stdout? Несколько строк в одну строку
  • Как я могу использовать sed для определения определенного количества чисел, прежде чем он вставляет символ? ### - ### - ####
  • Цитирование через файл с использованием столбца
  • Строки Grep со случайными числовыми символами
  • Как проверить цель символической ссылки указывает на конкретный путь
  • 2 Solutions collect form web for “Как передать содержимое файла параметру / параметру функции”

    Ответ на вопрос Жиля:

     parallel 'head -n "$(cat {1})" {2}' ::: File1s* :::+ Corresponding_File2s* 

    Вероятно, у вас есть много файлов File1s, которые вы хотите связать с File2s. Это делает ::: +.

    Используйте подстановку команд .

     head -n "$(cat File1)" File2 

    Подстановка команды вводит вывод команды в командную строку. Новые строки в конце вывода удаляются, что вам и нужно здесь.

    Кроме того, в bash (но не в других вариантах sh) вы можете использовать встроенный файл mapfile для загрузки файла по mapfile .

     mapfile lines <File1 head -n "${lines[0]}" File2 

    Строки загружаются в массив, поэтому номер строки n равен ${lines[ n ]} . Для первой строки bash также позволяет писать $line .

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