Почему awk sub не заменяет мой ввод

289
Przemek Hugh Kaznowski

Я изо всех сил пытался написать программу awk, которая будет принимать входные файлы и отображать исходное и разделенное пробелами имя файла только во втором столбце. Почему следующая команда не работает для этого?

echo -e "abc/123\ndef/456" | awk ''

Для записи вышеприведенных выводов

mv abc/123 abc/123 mv def/456 def/456 
0
Bash способен сделать это самостоятельно; зачем тебе awk? Ignacio Vazquez-Abrams 5 лет назад 0
Туннельное зрение, я буду обновлять с решением Bash, спасибо! Przemek Hugh Kaznowski 5 лет назад 0
Какой результат вы надеетесь достичь? Эта функция sub () удалит первый символ строки. Вы хотели использовать вместо этого регулярное выражение `. * /`? glenn jackman 5 лет назад 0

1 ответ на вопрос

0
glenn jackman

lпеременная, которая содержит замененный текст $lэто значение номера столбца, на которое ссылается значение, хранящееся в переменной l. Поскольку lзначение не начинается с цифр, awk обрабатывает строку как число «0», поэтому вы получаете $0текущую запись.

Вы хотите это вместо

print "mv", $1, l 
Спасибо, это именно то, что я искал! Для тех, кто заинтересован, вот команда, которую вы можете использовать, чтобы получить все файлы с одинаковым именем и сохранить их где-нибудь `find. имя "debug.log" | awk ' '` Przemek Hugh Kaznowski 5 лет назад 0
Или, может быть, `mv -b -t. ** / debug.log` (не проверено) glenn jackman 5 лет назад 0
Не знал об этом, еще раз спасибо за то, что поделился. К сожалению, это не сработает, так как жалуется на файлы с одинаковыми именами, но это стоит запомнить в любом случае. Кроме того, поскольку я в bash, расширение `**` не работает, но, вероятно, будет работать в zsh для всех, кто читает Przemek Hugh Kaznowski 5 лет назад 0
`shopt -s globstar` включает ** glenn jackman 5 лет назад 0