Есть ли краткий способ получить awk для печати всего, кроме первого поля записи? - PullRequest
4 голосов
/ 22 декабря 2009

Я хотел бы скопировать команды из моей недавней истории команд в файл, но история выглядит так:

568  find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && NR <= 10' {} \;
569  find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
570  history 10

Я хочу снять цифры слева. Есть ли короткий способ сделать это в awk без явного использования $ 2 $ 3 $ 4 и т. Д. Для вывода всего, кроме первого поля?

Ответы [ 4 ]

4 голосов
/ 22 декабря 2009

, если не возражаете против небольшого пространства впереди

awk '{$1="";print}' file

в противном случае, сделайте дополнительный саб / gsub, чтобы избавиться от него. Другой способ - использовать цикл for

awk '{for(i=2;i<=NF;i++) printf "%s " ,$i}' file

Заимствование из решения pax, версия awk с использованием регулярных выражений (кто говорит, что вам нужен sed):)

awk '{gsub(/^ *[^ ]* */,"")}1' file
3 голосов
/ 22 декабря 2009

Если вы не против использовать что-то кроме awk:

history 10 | cut -c 8-
1 голос
/ 22 декабря 2009

Если вы не против использования других инструментов, попробуйте sed, лучше сохранить интервал исходного файла:

pax> cat qq.in
568  find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && NR <= 10' {} \;
569  find . -name "*.txt" -mtime -1 -print -exec awk 'blah blah' {} \;
570  history 10

pax> cat qq.in | sed 's/^ *[^ ]* *//'
find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && NR <= 10' {} \;
find . -name "*.txt" -mtime -1 -print -exec awk 'blah blah' {} \;
history 10

Он в основном удаляет все начальные пробелы, за которыми следуют любые непробельные символы, за которыми следуют пробельные символы, что эффективно обрезает первое слово в каждой строке.

Если формат строки может быть привязан к любому количеству цифр в начале строки, за которым следуют два пробела, тогда интересующий вас текст, вы можете немного улучшить регулярное выражение (есть два пробела после *):

sed 's/^[0-9]*  //'
0 голосов
/ 22 декабря 2009

Это альтернатива в awk, которая также сохраняет пробелы.

history | awk '{sub($1, "", $0); sub(/^[ \t]+/, "", $0); print}'

Обратите внимание, что sub по умолчанию $0, так что вы можете пропустить это.

history | awk '{sub($1, ""); sub(/^[ \t]+/, ""); print}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...