Select row and element in awk

前端 未结 4 887
温柔的废话
温柔的废话 2021-01-29 18:17

I learned that in awk, $2 is the 2nd column. How to specify the ith line and the element at the ith row and jth column?

相关标签:
4条回答
  • 2021-01-29 19:01

    To expand on Dennis's answer, use awk's -v option to pass the i and j values:

    # print the j'th field of the i'th line
    awk -v i=5 -v j=3 'FNR == i {print $j}'
    
    0 讨论(0)
  • 2021-01-29 19:04

    To print the second line:

    awk 'FNR == 2 {print}'
    

    To print the second field:

    awk '{print $2}'
    

    To print the third field of the fifth line:

    awk 'FNR == 5 {print $3}'
    

    Here's an example with a header line and (redundant) field descriptions:

    awk 'BEGIN {print "Name\t\tAge"}  FNR == 5 {print "Name: "$3"\tAge: "$2}'
    

    There are better ways to align columns than "\t\t" by the way.

    Use exit to stop as soon as you've printed the desired record if there's no reason to process the whole file:

    awk 'FNR == 2 {print; exit}'
    
    0 讨论(0)
  • 2021-01-29 19:07

    Since awk and perl are closely related...


    Perl equivalents of @Dennis's awk solutions:

    To print the second line:
    perl -ne 'print if $. == 2' file

    To print the second field:
    perl -lane 'print $F[1]' file

    To print the third field of the fifth line:
    perl -lane 'print $F[2] if $. == 5' file


    Perl equivalent of @Glenn's solution:

    Print the j'th field of the i'th line

    perl -lanse 'print $F[$j-1] if $. == $i' -- -i=5 -j=3 file


    Perl equivalents of @Hai's solutions:

    if you are looking for second columns that contains abc:

    perl -lane 'print if $F[1] =~ /abc/' foo

    ... and if you want to print only a particular column:

    perl -lane 'print $F[2] if $F[1] =~ /abc/' foo

    ... and for a particular line number:

    perl -lane 'print $F[2] if $F[1] =~ /abc/ && $. == 5' foo


    -l removes newlines, and adds them back in when printing
    -a autosplits the input line into array @F, using whitespace as the delimiter
    -n loop over each line of the input file
    -e execute the code within quotes
    $F[1] is the second element of the array, since Perl starts at 0
    $. is the line number

    0 讨论(0)
  • 2021-01-29 19:17

    To print the columns with a specific string, you use the // search pattern. For example, if you are looking for second columns that contains abc:

    awk '$2 ~ /abc/'
    

    ... and if you want to print only a particular column:

    awk '$2 ~ /abc/ { print $3 }'
    

    ... and for a particular line number:

    awk '$2 ~ /abc/ && FNR == 5 { print $3 }'
    
    0 讨论(0)
提交回复
热议问题