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

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

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

Пример файла-пары:

 File1: 2 File2: AAA BBB CCC DDD 

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

 File3: AAA BBB 

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

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

  • Следует ли указывать переменные при выполнении?
  • В чем разница между autossh и ssh, которые помещаются в цикл while?
  • Как добавить несколько строк в файл с помощью bash, с символом «-» перед строкой
  • Work-Around для хранения значений массива в переменной среды, а затем вызов из сценария Bash
  • Убивание фонового процесса в скрипте bash при выходе из скрипта
  • Возможно ли иметь комментарии в многострочных командах в рыбе?
  • Использование переменных bash в команде perl в сценарии bash
  • Как обнаружить, что выполняется менее чем x процессов
  • 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 - лучшая ОС в мире.