Вы можете сделать это в одной команде (и без каких-либо вспомогательных оболочек):
sed 's/^/Name: /;q' /p/raw.txt >> /p/001.txt
Это префиксы «Имя:» перед первой линии, печатает его, а затем завершает работу таким образом Вы не Не обрабатывайте дополнительные строки. Добавьте номер строки до q
, чтобы распечатать все строки до (и включая) этого номера. Результат добавляется к /p/001.txt
точно так же, как ваш исходный код.
Если вы хотите диапазон строк:
sed -n '3,9{s/^/Name: /;p}9q' /p/raw.txt >> /p/001.txt
Это читает строки 3-9, выполняет замену, отпечатки, а затем завершает работу после строки 9.
Если вы хотите, чтобы определенные строки, я рекомендуем awk:
awk 'NR==3 || NR==9 { print "Name: " $0 } NR>=9 { exit }' /p/raw.txt >> /p/001.txt
У этого есть два предложения. Один говорит, что число записей (номер строки) равно 3 или 9, и в этом случае мы печатаем префикс и строку. Другой говорит нам прекратить чтение файла после 9-й записи.
Вот еще две команды, чтобы показать, как AWK могут действовать только на первой линии (ы) или в заданном диапазоне:
awk '{ print "Name: " $0 } NR >= 1 { exit }' /p/raw.txt >> /p/001.txt
awk '3 <= NR { print "Name: " $0 } NR >= 9 { exit }' /p/raw.txt >> /p/001.txt
Это кажется, вы постоянно строит один файл от другого , Рассмотрим:
tail -Fn0 /p/raw.txt |sed 's/^/Name: /' >> /p/001.txt
Это будет работать непрерывно, добавляя только новые записи (добавлены после выполнения команды) для /p/001.txt
Возможно, у вас есть много дублей, чтобы решить?
awk 'NR != FNR { $0 = "Name: " $0 } !s[$0]++' \
/p/001.txt /p/raw.txt > /tmp/001.txt && mv /tmp/001.txt /p/001.txt
Это складывает вместе ранее сохраненные имена с любыми новыми именами, названиями печати только один раз (!s[$0]++
верно, когда s[$0]
равен нулю (его состояние по умолчанию), но после оценки, он увеличивает на один, что делает его ложным во втором вступлении. Когда у голого предложения нет действия, строка печатается.) Поскольку мы читаем выходной файл, нам нужен временный вывод. После его успешного завершения мы переместим его поверх целевого выходного файла.
sed только решение выглядит блестящим – sjsam
** Очень умный ! ** со всем уважением к первому решению sjsam - это гораздо более прямолинейно! Адам, может быть, вы могли бы расширить это, чтобы добавить не только ** Имя: ** ПЕРЕД, но и что-то ПОСЛЕ, например ** неизвестно **? Получить окончательный результат ** Название: John Doe неизвестен **? – Serge
@Serge: вставьте вторую команду 's', которая заменяет дополнительный текст для' $ '(конец строки):' sed 's/^/Name: /; s/$/неизвестно /; q'' – mklement0