这一行一直工作到第二个字段中出现空白。
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
有没有办法让awk打印所有2美元或更大的东西?(3、4美元. .直到我们不再有专栏了?)
我想我应该补充一点,我正在使用Cygwin在Windows环境中执行此操作。
这一行一直工作到第二个字段中出现空白。
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
有没有办法让awk打印所有2美元或更大的东西?(3、4美元. .直到我们不再有专栏了?)
我想我应该补充一点,我正在使用Cygwin在Windows环境中执行此操作。
当前回答
Perl的解决方案:
perl -lane 'splice @F,0,1; print join " ",@F' file
使用这些命令行选项:
-n循环输入文件的每一行,不自动打印每一行 -l在处理之前删除换行符,并在处理之后将它们添加回去 -a autosplit mode -将输入行分割到@F数组中。默认为空格分割 -e执行perl代码
splice @F,0,1从@F数组中清除第0列
join " ",@F连接@F数组的元素,在每个元素之间使用一个空格
Python的解决方案:
[sys.stdout.]写(' ' . join (line.split () [1:]) + ' \ n ')系统的线。Stdin]" <文件
其他回答
更新:
如果你想在保留空格和制表符的同时不使用任何函数调用,那么:
echo " 1 2 33 4444 555555 \t6666666 " |
{m,g}awk ++NF FS='^[ \t]*[^ \t]*[ \t]+|[ \t]+$' OFS=
=
2 33 4444 555555 6666666
===================
你可以让它更直接:
svn status | [m/g]awk '/!/*sub("^[^ \t]*[ \t]+",_)'
svn status | [n]awk '(/!/)*sub("^[^ \t]*[ \t]+",_)'
自动处理管道中早期的grep,以及在删除$1后删除额外的FS,额外的好处是保留原始输入的其余部分,而不是用空格覆盖制表符(除非这是想要的效果)
如果你非常确定$1不包含需要regex转义的特殊字符,那么就更容易了:
mawk '/!/*sub($!_"[ \t]+",_)'
gawk -c/P/e '/!/*sub($!_"""[ \t]+",_)'
或者如果你更喜欢自定义FS+OFS来处理这一切:
mawk 'NF*=/!/' FS='^[^ \t]*[ \t]+' OFS='' # this version uses OFS
Awk示例在这里看起来很复杂,这里是简单的Bash shell语法:
command | while read -a cols; do echo ${cols[@]:1}; done
1是第n列,从0开始计数。
例子
给定文件(in.txt)的内容:
c1
c1 c2
c1 c2 c3
c1 c2 c3 c4
c1 c2 c3 c4 c5
输出如下:
$ while read -a cols; do echo ${cols[@]:1}; done < in.txt
c2
c2 c3
c2 c3 c4
c2 c3 c4 c5
您可以使用for循环来循环打印字段$2到$NF(表示行上字段数量的内置变量)。
编辑: 由于"print"附加了换行符,你需要缓冲结果:
awk '{out = ""; for (i = 2; i <= NF; i++) {out = out " " $i}; print out}'
或者,使用printf:
awk '{for (i = 2; i <= NF; i++) {printf "%s ", $i}; printf "\n"}'
如果需要用任意delimeter打印特定列:
awk '{print $3 " " $4}'
同# 3 # 4
awk '{print $3 "anything" $4}'
与3anythingcol # 4
因此,如果您在一列中有空格,它将是两列,但您可以使用任何分隔符连接它或不使用它。
ls -la | awk '{o=$1" "$3; for (i=5; i<=NF; i++) o=o" "$i; print o }'
这个答案还不错,但是自然的间隔消失了。 请将它与这个进行比较:
ls -la | cut -d\ -f4-
然后你就会看到区别了。
甚至ls -la | awk '{$1=$2="";打印},这是基于迄今为止投票选出的最佳答案,即不保留格式。
因此,我将使用以下,它还允许显式选择列在开始:
ls -la | cut -d\ -f1,4-
注意,每个空格也计算列,例如在下面,列1和列3是空的,2是INFO, 4是:
$ echo " INFO 2014-10-11 10:16:19 main " | cut -d\ -f1,3
$ echo " INFO 2014-10-11 10:16:19 main " | cut -d\ -f2,4
INFO 2014-10-11
$