Используйте команду find
в сочетании с оболочкой, используя флаг -exec
:
$ find -name "*.test" -exec sh -c 'echo "$(basename -s ".test" "$1")".js' sh {} \;
one.js
three.js
two.js
Обратите внимание, что basename -s ".test" "$1"
удаляет суффикс, поэтому вам не нужно вызывать sed
в первую очередь.
Если в конечном итоге вам понадобится сделать что-то еще с этим «фиксированным именем файла», замените это эхо на присваивание переменной и продолжайте работать с той же командой sh
. Примерно так:
$ find -name "*.test" -exec sh -c 'fixed_name=$(basename -s ".test" "$1").js; my_other_command "$fixed_name"' sh {} \;
$ awk '{ print $(NF-2), $(NF-1), $NF}' file1
14:00:01.071 5255 604177
14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
14:00:01.074 11723 155575
14:00:01.075 4695 885808
Это совершенно неверно, $NF-1
напечатает значение последнего столбца, вычитаемое на единицу. Вам нужно сгруппировать команду внутри (..)
, так как NF
является переменной
gawk 'NF>=3{ print $(NF-2), $(NF-1), $NF}' file
Часть NF>=3
предназначена для безопасной проверки того, что вы печатаете последние 3 поля в строках, которые гарантированно содержат как минимум 3 поля.
С GNU grep
вы можете сделать:
grep -Eo '\S+\s+\S+\s+\S+\s*$'
Это позволит сохранить интервал во входных данных. Обратите внимание, что строки, содержащие менее 3 полей, пропускаются.
POSIX эквивалентом будет:
S='[^[:space:]]\{1,\}' s='[[:space:]]\{1,\}'
sed -n "s/$S$s$S$s${S}[[:space:]]*$/\\
&/;s/.*\n//p"
Я протестировал приведенную ниже команду, и она работала нормально
sed "s/^[0-9]\{1,\}//g" filename| sed -r "s/^\s+//g"
выход
14:00:01.071 5255 604177
14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
14:00:01.074 11723 155575
14:00:01.075 4695 885808
Если предположить
, затем вы можете использовать cut -d' ' -f2-
для печати из файла значений, разделенных пробелом -, содержимого от второго до последнего столбца.
awk '{print $(NF-2),$(NF-1),$(NF)}' file.txt
Где NF — количество полей в вашем файле.
Поскольку вопрос помеченperl
$ perl -lane 'print "@F[-3..-1]"' ip.txt
14:00:01.071 5255 604177
14:00:01.074 4608 1415742
14:00:01.074 18398 1122001
14:00:01.074 11723 155575
14:00:01.075 4695 885808
-l
удалять новые строки из входных строк и добавлять их в конец строки при использовании print
-a
автоматическое разделение ввода на основе пробелов, доступное через @F
массив print "@F[-3..-1]"
вывести нужные поля, разделителем по умолчанию, когда массив указан в двойных кавычках, является одиночный пробел -1
относится к последнему полю, -2
относится к предпоследнему полю и т. д. ..
— оператор диапазона Используйте perl -lane 'print "@F[-3..-1]" if $#F > 2'
, если вы не хотите, чтобы отображались строки с менее чем 3 полями. $#F
дает последний индекс массива, т.е. размер массива минус 1