
У меня есть набор пар файлов .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 переменной (хотя я не знаю, можно ли передать это в head
опцию -n
?); однако, похоже, parallel {}
усложняет этот подход.
При необходимости я могу предоставить дополнительную информацию.
решение1
Использоватьзамена команды.
head -n "$(cat File1)" File2
Подстановка команды вставляет вывод команды в командную строку. Переводы строк в конце вывода удаляются, что как раз то, что вам здесь нужно.
В качестве альтернативы в bash (но не в других вариантах sh) можно использовать командуmapfile
встроенная функция для построчной загрузки файла.
mapfile lines <File1
head -n "${lines[0]}" File2
Строки загружаются в массив, поэтому номер строкинэто . Для первой строки bash также позволяет вам написать .${lines[n]}
$line
решение2
Расширяя ответ Жиля:
parallel 'head -n "$(cat {1})" {2}' ::: File1s* :::+ Corresponding_File2s*
У вас, вероятно, есть много File1, которые вы хотите связать с File2. :::+ делает это.