2013-09-14 3 views
1

У меня есть следующий файл с именем abc с 10 строками текста и script.awk файл, который печатает вывод как количество строк для печати (например, tail). В этом примере он печатает последние 3 строки, но я хочу, счетчик будет использоваться в качестве пользовательского ввода т.е. таким образом я могу запустить:Передача аргумента счетчика скрипту awk

$ awk -f script.awk abc <counter> 

Как я могу это сделать?

аЬс

skdns;avbvbkabvbakv 
sad;vn;kns;anv;navvs 
skdns;avbvbkabvbakv 
sad;vn;kns;anv;navvs 
skdns;avbvbkabvbakv 
sad;vn;kns;anv;navvs 
skdns;avbvbkabvbakv 
sad;vn;kns;anv;navvs 
skdns;avbvbkabvbakv 
sad;vn;kns;anv;navvs 

script.awk

{ 
    arr[NR]=$0 
} 
END { 
    i=NR-3 
    while(i<NR) 
    { 
     print arr[i+1] 
     i++ 
    } 
} 

ответ

2

Для начала вы действительно хотите for цикл здесь не while:

{ 
    arr[NR]=$0 
}  
END { 
    for (i=NR-2;i<=NR;i++) { 
     print arr[i] 
    } 
} 

Если вам не нужно, чтобы получить доступ к переменной в блоке BEGIN вам не нужно использовать -v так что вы бы просто do awk -f file n=3 (любой аргумент, переданный awk, содержащий =, будет рассматриваться как переменная). Далее будет обрабатывать, если n снята с охраны или больше, чем количество строк в файле:

{ 
    arr[NR]=$0 
}  
END { 
    n=(n?n:NR) 
    n=(n?NR:NR:n) 
    for (i=NR-n+1;i<=NR;i++) { 
     print arr[i] 
    } 
} 

Демо:

$ seq 1 10 | awk -f script.awk n=5 
6 
7 
8 
9 
10 

$ seq 1 3 | awk -f script.awk 
1 
2 
3 

$ seq 1 3 | awk -f script.awk n=6 
1 
2 
3 

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

+0

Спасибо .. но 'п = (п п: 10)' влияют, если моя линия более или менее 10 ?? – vishalkin

+1

@ vishalkin yeah 'n = (n? N: NR)' лучше. –

+0

спасибо @sudo_O это второй раз, когда я ответил на мой вопрос ... теперь я работаю с печатью 1-го ** n строк ** используя awk ... надеюсь, что мне удастся. В противном случае я надеюсь, что вы будете там, чтобы помочь мне out ... – vishalkin

1

AWK имеет '-v переменная = значение' возможность установить переменные из командной строки опцию.

1

Просто сделайте i = NR - j в своем скрипте awk.

Теперь используйте эту команду

awk -f script.awk -v j=3 abc 
Смежные вопросы