如何打印第三列到最后一列?(How to print third column to last co

2019-08-31 06:58发布

我试图从DBGVIEW日志文件中删除前两列(其中我不感兴趣)。 我似乎无法找到,从第3列打印开始直到行末的例子。 请注意,每一行都有可变的列数。

Answer 1:

...或者简单的解决方案: cut -f 3- INPUTFILE只是添加正确的分隔符(-d)和你有同样的效果。



Answer 2:

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


Answer 3:

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

解决办法在这里找到:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/



Answer 4:

乔纳森·范伯格的答案打印在单独一行上每个字段。 你可以使用printf重建记录在同一个线路输出,但你也可以只移动领域的跳转到左边。

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


Answer 5:

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

注:此方法将留在1,2,3领域的“空白”,而不是一个问题,如果你只是想看看输出。



Answer 6:

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

这扒什么是某一领域NR之前,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 

输出保持一切,包括尾部空格

行之有效的文件,其中“/ N”是记录分隔符,所以你没有行内的新行字符。 如果你想与其他记录分隔使用它然后使用:

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

例如。 与几乎所有的文件,只要他们不使用十六进制字符NR效果很好。 1行的内侧。



Answer 7:

什么下面一行:

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

基于@ ghostdog74建议。 煤矿应该表现更好,当你过滤线,即:

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


Answer 8:

如果你要打印在同一行的第三个例如后列,你可以使用:

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

正如我们所看到的,工资单即使有空间,显示了正确的路线。



Answer 9:

下面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


Answer 10:

那么,你可以使用正则表达式容易达到相同的效果。 假定分隔符是空格,它看起来像:

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


Answer 11:

Perl的解决方案:

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

这些命令行选项用于:

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

  • -l处理之前将新行,并把它们放回之后

  • -a自动分割模式-分裂输入线到@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



Answer 12:

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

首先,你找到第三列的起始位置。 随着SUBSTR您将打印整条生产线($ 0)开始的位置(在这种情况下),以该行的末尾。



Answer 13:

有点晚了这里,但没有上述的似乎工作。 试试这个,用printf,每次插入之间的间隔。 我选择了在年底前不会有新行。

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


Answer 14:

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

从第4场以相同的顺序开始到最后现场打印的记录,他们在原来的文件



Answer 15:

在bash,那么你可以使用带有位置参数的语法如下:

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

了解更多: 处理位置参数在打击黑客的Wiki



Answer 16:

如果只有约忽略了前两个字段,如果屏蔽这些字段(如上面的一些做的答案),当您不想要一个空间:

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


Answer 17:

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

前两个栏都被清零, sed删除前导空格。



Answer 18:

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

所有行:

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

只有第一行:

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


文章来源: How to print third column to last column?