Answers:
...或更简单的解决方案:cut -f 3- INPUTFILE
只需添加正确的定界符(-d),您将获得相同的效果。
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
将不打印换行符字符,而print ""
将其他字段后面添加新行已打印)
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
,其给出:3 4 5 6 7 8 9 10
。
awk '{ print substr($0, index($0,$3)) }'
此处找到解决方案:http :
//www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
乔纳森·费恩伯格(Jonathan Feinberg)的答案将每个字段打印在单独的行上。您可以printf
用来重建记录以在同一行上输出,但是您也可以仅将字段向左移动。
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
NF
POSIX不允许递减。
NF
可以递减保持沉默。
awk '{$1=$2=$3=""}1' file
注意:此方法将在1,2,3字段中留下“空白”,但如果您只想查看输出,则不会有问题。
1
是什么意思?我应该用哪个关键词搜索awk
?
{$1=$2=$3="";$0=$0;$1=$1}1
例如,如果要在第三行之后打印同一行中的列,则可以使用:
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
如我们所见,即使有空格,工资单也会显示在正确的行中。
接下来的行呢:
awk'{$ 1 = $ 2 = $ 3 =“”; 打印}”文件
基于@ ghostdog74的建议。当您过滤线时,我的表现应该更好,例如:
awk'/ ^ exim4-config / {$ 1 =“”; 打印}'文件
sed 's/\s\+//g'
在命令末尾进行管道处理并添加以修剪前导空格
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)}'
例如。只要几乎不使用十六进制char nr,几乎所有文件都可以很好地工作。1行内。
以下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
好了,您可以使用正则表达式轻松实现相同的效果。假设分隔符是一个空格,它将看起来像:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
将模式删除两次。
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
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
以与原始文件中相同的顺序打印从第四个字段开始到最后一个字段的记录