Печатать только последние три столбца из файла

Используйте команду 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 {} \;  
3
07.08.2019, 13:21
7 ответов
$ 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
4
27.01.2020, 21:07

Это совершенно неверно, $NF-1напечатает значение последнего столбца, вычитаемое на единицу. Вам нужно сгруппировать команду внутри (..), так как NFявляется переменной

gawk 'NF>=3{ print $(NF-2), $(NF-1), $NF}' file

Часть NF>=3предназначена для безопасной проверки того, что вы печатаете последние 3 поля в строках, которые гарантированно содержат как минимум 3 поля.

6
27.01.2020, 21:07

С 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"
3
27.01.2020, 21:07

Я протестировал приведенную ниже команду, и она работала нормально

 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
2
27.01.2020, 21:07

Если предположить

  1. Разделитель — пробел
  2. Вам нужны все, кроме первого столбца,который может быть пустым, но будет иметь разделитель
  3. Между столбцами есть только один разделитель

, затем вы можете использовать cut -d' ' -f2-для печати из файла значений, разделенных пробелом -, содержимого от второго до последнего столбца.

7
27.01.2020, 21:07

awk '{print $(NF-2),$(NF-1),$(NF)}' file.txt

Где NF — количество полей в вашем файле.

0
27.01.2020, 21:07

Поскольку вопрос помечен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

0
27.01.2020, 21:07

Теги

Похожие вопросы