这一行一直工作到第二个字段中出现空白。
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环境中执行此操作。
当前回答
更新:
如果你想在保留空格和制表符的同时不使用任何函数调用,那么:
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 '{print $0}' somefile
打印除第一列以外的所有内容:
awk '{$1=""; print $0}' somefile
打印除前两列以外的所有内容:
awk '{$1=$2=""; print $0}' somefile
如果你想要格式化文本,用echo链接你的命令并使用$0打印最后一个字段。
例子:
for i in {8..11}; do
s1="$i"
s2="str$i"
s3="str with spaces $i"
echo -n "$s1 $s2" | awk '{printf "|%3d|%6s",$1,$2}'
echo -en "$s3" | awk '{printf "|%-19s|\n", $0}'
done
打印:
| 8| str8|str with spaces 8 |
| 9| str9|str with spaces 9 |
| 10| str10|str with spaces 10 |
| 11| str11|str with spaces 11 |
更新:
如果你想在保留空格和制表符的同时不使用任何函数调用,那么:
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 '{print substr($0,length($1)+1);}' < file
它在前面留下了一些空白。
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
$