在shell上,当我需要一个特定的列时,我会输入awk。
这会打印第9列,例如:
... | awk '{print $9}'
如何告诉awk打印包括第9列之后的所有列,而不仅仅是第9列?
答案 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 faux
或 my file.txt
的输出的情况(不推荐,只给出最后一列可能包含空格序列的例子))。我们希望保留剩余列中的任何连续空白,以便名为 my file.txt
的文件不会变成 awk
。
使用 sed
为行的其余部分保留空白非常困难。即使有建议的改进,接受的基于 awk 的答案也没有。
perl
或 echo '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