6

我正在处理以下 bash 脚本:

# contents of dbfake file
1 100% file 1
2 99%  file name 2
3 100% file name 3

#!/bin/bash

# cat out data
cat dbfake |

# select lines containing 100%
grep 100% |

# print the first and third columns
awk '{print $1, $3}' |

# echo out id and file name and log
xargs -rI % sh -c '{ echo %; echo "%" >> "fake.log"; }'

exit 0

这个脚本工作正常,但是我如何打印列 $3 中的所有内容,然后打印所有列?

4

5 回答 5

12

在这种情况下,您可以使用 cut 而不是 awk:

  cut -f1,3- -d ' '
于 2013-02-10T22:31:11.513 回答
9
awk '{ $2 = ""; print }' # remove col 2
于 2013-02-10T22:29:54.057 回答
1

如果你不介意一点空白:

awk '{ $2="" }1'

但是UUOCgrep

< dbfake awk '/100%/ { $2="" }1' | ...

如果您想修剪该空白:

< dbfake awk '/100%/ { $2=""; sub(FS "+", FS) }1' | ...


为了好玩,这是另一种使用方式GNU sed

< dbfake sed -r '/100%/s/^(\S+)\s+\S+(.*)/\1\2/' | ...
于 2013-02-10T22:31:09.690 回答
0

其他人以各种方式回应,但我想指出,使用 xargs 来多路复用输出是一个相当糟糕的主意。

相反,你为什么不:

awk '$2=="100%" { sub("100%[[:space:]]*",""); print; print >>"fake.log"}' dbfake

就这样。你不需要 grep,你不需要多个管道,而且绝对不需要为你输出的每一行 fork shell。

你可以这样做awk ...; print}' | tee fake.log,但如果 awk 也能处理它,那么分叉 tee 没有多大意义。

于 2013-02-10T23:20:50.647 回答
0

所有你需要的是:

awk 'sub(/.*100% /,"")' dbfake | tee "fake.log"
于 2013-02-11T00:48:25.283 回答