xargs с head -n

#bash #xargs

#bash #xargs

Вопрос:

Я пытаюсь написать команду, которая берет случайную строку из CSV и выводит эту строку минус 5. Скажем, она выводит строку 50, затем она должна печатать от 46 до 50, оба включены. Я могу добиться этого в два этапа, однако при попытке использовать «xargs» для передачи номера строки следующей команде (head -n) я получил сообщение об ошибке: "head: invalid number of lines: ‘{}’" . Моя команда:

 cat test.csv |  awk '{ print NR }' | shuf -n 1 | xargs -l head -n "{}" test.csv | tail -n 5
  

Где "xargs -l head -n "{}" test.csv" следует собрать число из "shuf" функции, а затем свести его к 5, чтобы захватить последние 5 строк.

Что я делаю не так?

Спасибо

Ответ №1:

Цитирую справочную страницу xargs:

-Я заменяю-str

Замените вхождения replace-str в начальных аргументах именами, считанными из стандартного ввода. Кроме того, пробелы без кавычек не завершают входные элементы; вместо этого разделителем является символ новой строки. Подразумевает -x и -L 1 .

Как вы можете видеть, флаг -I необходим, чтобы указать строку замены для вашей команды.

Без указанной строки xargs просто добавит значение каждой строки в конец вашей команды. Итак, должно работать следующее:

 cat test.csv |  awk '{ print NR }' | shuf -n 1 | xargs -I {} head -n "{}" test.csv | tail -n 5