Вывести последние 10 строк определенных столбцов с помощью awk - PullRequest
2 голосов
/ 17 июля 2009

У меня есть приведенный ниже аргумент командной строки awk, и он работает помимо факта, что он выполняет аргумент печати для всего файла (как и ожидалось). Я хотел бы просто выполнить форматирование на последних 10 строках файла (или на любом произвольном числе). Любые предложения с благодарностью, спасибо!

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

awk '{print "<category label=\"" $13 " " $14 " " $15 "\"/>"}' foofile

Ответы [ 7 ]

9 голосов
/ 17 июля 2009

Нет необходимости быть православным с языком или инструментом на оболочке Unix.

tail -10 foofile | awk '{print "<category label=\"" $13 " " $14 " " $15 "\"/>"}'

- это хорошее решение. И у вас уже было это.

Ваше произвольное число все еще может быть использовано в качестве аргумента для tail, ничего не потеряно; ​​
Решение не теряет элегантности.

3 голосов
/ 18 июля 2009

Используя кольцевые буферы, этот однострочный выводит последние 10 строк;

awk '{a[NR%10]=$0}END{for(i=NR+1;i<=NR+10;i++)print a[i%10]}'

затем вы можете объединить «печать последних 10 строк» ​​и «печать определенных столбцов», как показано ниже;

{
    arr_line[NR % 10] = $0;
}

END {
    for (i = NR + 1; i <= NR + 10; i++) {
        split(arr_line[i % 10], arr_field);
        print "<category label=\"" arr_field[13] " " \
                                   arr_field[14] " " \
                                   arr_field[15] "\"/>";
    }
}
2 голосов
/ 17 июля 2009

Я не думаю, что это можно сделать аккуратно в awk. Единственный способ сделать это - сохранить последние X строк и затем распечатать их в блоке END.

Я думаю, тебе лучше держаться за хвост: -)

1 голос
/ 29 мая 2013

В случае переменной # столбцов я разработал два решения

#cutlast [number] [[$1] [$2] [$3]...]

function cutlast {
    length=${1-1}; shift
    list=( ${@-`cat /proc/${$}/fd/0`} )
    output=${list[@]:${#list[@]}-${length-1}}
    test -z "$output" && exit 1 || echo $output && exit 0
}
#example:  cutlast 2 one two three print print # echo`s print print
#example1: echo one two three four print print | cutlast 2 # echo`s print print

или

function cutlast {
    length=${1-1}; shift
    list=( ${@-`cat /proc/${$}/fd/0`} )
    aoutput=${@-`cat /proc/${$}/fd/0`} | rev | cut -d ' ' -f-$num | rev
    test -z "$output" && exit 1 || echo $output && exit 0
}

#example:  cutlast 2 one two three print print # echo`s print print
1 голос
/ 17 июля 2009

Только за последние 10 строк

awk 'BEGIN{OFS="\n"}
{
   a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i;i=j;j=$0
}END{    
    print a,b,c,d,e,f,g,h,i,j
}' file
0 голосов
/ 17 июля 2009
awk '{ y=x "\n" $0; x=$0 }; END { print y }'

Это очень неэффективно: он построчно читает весь файл только для печати последних двух строк.
Поскольку в awk нет оператора seek (), рекомендуется использовать tail для печати последних строк файла.

0 голосов
/ 17 июля 2009

В этом текстовом документе есть множество строк awk one. *1002*, не уверен, поможет ли это.

Это может быть именно то, что вам нужно (что-то похожее в любом случае):

# print the last 2 lines of a file (emulates "tail -2")
awk '{y=x "\n" $0; x=$0};END{print y}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...