如何使用awk打印特定数字后的所有列?

时间:2011-02-22 17:57:17

标签: shell awk

在shell上,当我需要一个特定的列时,我会输入awk。

这会打印第9列,例如:

... | awk '{print $9}'

如何告诉awk打印包括第9列之后的所有列,而不仅仅是第9列?

11 个答案:

答案 0 :(得分:73)

awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'

答案 1 :(得分:54)

当你想要做一系列字段时,awk并没有真正直接的方法来做到这一点。我建议改为cut

cut -d' ' -f 9- ./infile

修改

由于默认为制表符,添加了空格字段分隔符。感谢格伦指出这一点

答案 2 :(得分:50)

awk '{print substr($0, index($0,$9))}'

修改: 注意,如果第九个字段之前的任何字段包含与第九个字段相同的值,则不起作用。

答案 3 :(得分:7)

通常perl替换awk / sed / grep等。 al。,并且很多更便携(以及只是一个更好的小刀)。

perl -lane 'print "@F[8..$#F]"'

Timtowtdi当然适用。

答案 4 :(得分:2)

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

这会在给定的字段n,N之前剪切,并打印该行的所有其余部分,包括字段nr.N并保持原始间距(它不重新格式化)。如果该字段的字符串也出现在该行的其他位置,则不会产生问题,这是Ascherer答案的问题。

定义一个函数:

fromField () { 
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

并像这样使用它:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost   

输出维护所有内容,包括尾随空格 对于N = 0,它按原样返回整行,对于n> NF,返回空字符串

答案 5 :(得分:0)

要显示前3个字段并打印可以使用的其余字段:

awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename

其中$ 1 $ 2 $ 3是前3个字段。

答案 6 :(得分:0)

以下是ls -l输出的示例:

-rwxr-----@ 1 ricky.john  1493847943   5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john  1493847943  27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john  1493847943  21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john  1493847943  10627144 Apr 16 14:09 03-Where to Get Help.mp4

我在$9之后打印任何内容的解决方案是awk '{print substr($0, 61, 50)}'

答案 7 :(得分:0)

function print_fields(field_num1, field_num2){
    input_line = $0

    j = 1;
    for (i=field_num1; i <= field_num2; i++){
        $(j++) = $(i);

    }
    NF = field_num2 - field_num1 + 1;
    print $0

    $0 = input_line
}

答案 8 :(得分:0)

使用cut而不是awk,并通过使用-c character cut命令来解决从哪一列开始的问题。

我在这里说的是,给我除输出的前49个字符以外的所有字符。

 ls -l /some/path/*/* | cut -c 50-

ls命令末尾的/*/*/也是要告诉我子目录中的内容。

您也可以拉出某些范围的字符ala(从剪切的手册页中)。例如,显示当前登录用户的名称和登录时间:

       who | cut -c 1-16,26-38

答案 9 :(得分:0)

通常希望传递剩余的列未修改。也就是说,不会折叠连续的空白区域。

想象一下处理 ps fauxmy file.txt 的输出的情况(不推荐,只给出最后一列可能包含空格序列的例子))。我们希望保留剩余列中的任何连续空白,以便名为 my file.txt 的文件不会变成 awk

使用 sed 为行的其余部分保留空白非常困难。即使有建议的改进,接受的基于 awk 的答案也没有。

perlecho '1 2 3 4 5 6 7 8 9 10' | sed -E 's/^([^ \t]*[ \t]*){8}//' 更适合此任务。

sed

9   10

结果:

-E

{8} 选项启用现代 ERE 正则表达式语法。这为我省去了反斜杠转义括号和大括号的麻烦。

s 是一个量词,表示与前一项精确匹配 8 次。

sed \h 命令用空字符串替换 8 次出现的空白分隔词。该行的其余部分保持不变。

perl

Perl regex 支持水平空白的 echo '1 2 3 4 5 6 7 8 9 10' | perl -pe 's/^(\H*\h*){8}//' 转义。

9   10

结果:

java.time

答案 10 :(得分:-1)

ruby -lane 'print $F[3..-1].join(" ")' file