如何将第三列打印到最后一列?

时间:2009-10-21 16:37:58

标签: linux shell unix multiple-columns

我正在尝试从DbgView日志文件中删除前两列(我不感兴趣)。我似乎无法找到从第3列开始直到行结束的示例。请注意,每一行都有可变数量的列。

19 个答案:

答案 0 :(得分:98)

...或更简单的解决方案:cut -f 3- INPUTFILE只需添加正确的分隔符(-d)即可获得相同的效果。

答案 1 :(得分:97)

awk '{for(i=3;i<=NF;++i)print $i}' 

答案 2 :(得分:91)

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

此处找到的解决方案:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/

答案 3 :(得分:32)

Jonathan Feinberg 的回答在单独的一行打印每个字段。您可以使用printf在同一行上重建输出记录,但您也可以将字段向左移动。

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile

答案 4 :(得分:16)

awk '{$1=$2=$3=""}1' file

注意:这个方法会在1,2,3个字段中留下“空白”,但如果您只是想查看输出,则不会出现问题。

答案 5 :(得分:8)

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

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

定义一个函数:

fromField () { 
awk -v m="\x0a" -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 

输出维护所有内容,包括尾随空格

适用于&#39; / n&#39;是记录分隔符,所以你不在行内有新行字符。如果要将其与其他记录分隔符一起使用,请使用:

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

。适用于几乎所有文件,只要它们不使用十六进制字符。 1行内。

答案 6 :(得分:5)

以下几行:

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

基于@ ghostdog74建议。过滤行时,我的行为应该更好,即:

awk '/^exim4-config/ {$1=""; print }' file

答案 7 :(得分:5)

如果要在第3行之后打印列,例如在同一行中,可以使用:

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

例如:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

它将打印:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

正如我们所看到的,即使有空格,薪资单显示在正确的行中。

答案 8 :(得分:4)

以下awk命令打印每行的最后N个字段,并在该行的末尾打印一个换行符:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

在下面找到一个列出/ usr / bin目录内容的示例,然后保存最后3行,然后使用awk打印每行的最后4列:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

答案 9 :(得分:3)

嗯,您可以使用正则表达式轻松完成相同的效果。假设分隔符是一个空格,它看起来像:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

答案 10 :(得分:2)

Perl解决方案:

perl -lane 'splice @F,0,2; print join " ",@F' file

使用以下命令行选项:

  • -n循环输入文件的每一行,不自动打印每一行

  • -l在处理之前删除换行符,然后将其添加回来

  • -a autosplit模式 - 将输入行拆分为@F数组。默认为在空格上拆分

  • -e执行perl代码

splice @F,0,2从@F数组中干净地删除第0列和第1列

join " ",@F使用每个元素之间的空格连接@F数组的元素

如果您的输入文件是逗号分隔的,而不是以空格分隔,请使用-F, -lane

Python解决方案:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

答案 11 :(得分:2)

awk '{a=match($0, $3); print substr($0,a)}'

首先,您找到第三列开头的位置。 使用substr,您将从该位置(在本例中为a)开始打印整行($ 0)到行尾。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

在Bash中,您可以使用以下语法和位置参数:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

在Bash Hackers Wiki上了解更多:Handling positional parameters

答案 14 :(得分:1)

awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

以与原始文件相同的顺序打印从第4个字段开始到最后一个字段的记录

答案 15 :(得分:1)

这里有点晚了,但上述情况似乎都没有奏效。试试这个,使用printf,在每个之间插入空格。我选择最后没有换行。

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

答案 16 :(得分:0)

awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

清除前两列,sed删除前导空格。

答案 17 :(得分:0)

如果只是忽略前两个字段,并且在屏蔽这些字段时不想要空格(如上面的一些答案那样):

awk '{gsub($1" "$2" ",""); print;}' file

答案 18 :(得分:-1)

在AWK列中称为字段,因此NF是键

所有行:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

仅限第一行:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>