如何打印第三列到最后一列?
- 2024-10-29 08:34:00
- admin 原创
- 50
问题描述:
我正在尝试从 DbgView 日志文件中删除前两列(我不感兴趣)。我似乎找不到从第 3 列开始打印直到行末的示例。请注意,每行的列数不定。
解决方案 1:
...或者更简单的解决方案:cut -f 3- INPUTFILE
只需添加正确的分隔符(-d)即可获得相同的效果。
解决方案 2:
awk '{for(i=3;i<=NF;++i)print $i}'
解决方案 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/
解决方案 4:
Jonathan Feinberg的答案将每个字段打印在单独的行上。您可以使用printf
重建记录以在同一行上输出,但您也可以将字段向左移动一跳。
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
解决方案 5:
awk '{$1=$2=$3=""}1' file
注意:此方法会在 1、2、3 字段中留下“空白”,但如果您只想查看输出,则这不是问题。
解决方案 6:
例如,如果您想在同一行打印第三列之后的列,则可以使用:
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
我们可以看到,工资单即使有空格,也显示在正确的行中。
解决方案 7:
那么下面这一行呢:
awk'{$1=$2=$3="";打印}'文件
根据@ghostdog74的建议。当你过滤行时,我的应该表现得更好,即:
awk'/^exim4-config/{$1=""; print}'文件
解决方案 8:
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)}'
例如。只要行内不使用十六进制字符 1,几乎可以适用于所有文件。
解决方案 9:
awk '{a=match($0, $3); print substr($0,a)}'
首先,找到第三列的起始位置。使用 substr,您将从位置(在本例中为 a)开始到行尾打印整行 ($0)。
解决方案 10:
以下 awk 命令打印每行的最后 N 个字段,并在行末打印一个换行符:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "
"); }'
下面的示例列出了 /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( "
"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
解决方案 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:]) + '
') for line in sys.stdin]" < file`
解决方案 12:
其实,你可以使用正则表达式轻松实现相同的效果。假设分隔符是空格,则它看起来像:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
解决方案 13:
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'
解决方案 14:
有点晚了,但以上方法似乎都不起作用。试试这个,使用 printf,在每个之间插入空格。我选择在末尾不加换行符。
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
解决方案 15:
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("
");}'
按照原始文件中的顺序打印从第 4 个字段到最后一个字段的记录
解决方案 16:
在 Bash 中,你可以使用带有位置参数的以下语法:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
了解更多:Bash Hackers Wiki 上的处理位置参数
解决方案 17:
如果只是忽略前两个字段,并且如果您不想在屏蔽这些字段时留有空格(就像上面的某些答案一样):
awk '{gsub($1" "$2" ",""); print;}' file
解决方案 18:
awk '{$1=$2=""}1' FILENAME | sed 's/s+//g'
清除前两列,sed
删除前导空格。
解决方案 19:
在 AWK 中,列称为字段,因此 NF 是关键
所有行:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
仅限第一行:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件