我正在处理以下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列中打印所有内容,然后在所有列之后打印?
答案 0 :(得分:12)
在这种情况下,您可以使用cut而不是awk:
cut -f1,3- -d ' '
答案 1 :(得分:9)
awk '{ $2 = ""; print }' # remove col 2
答案 2 :(得分:1)
如果你不介意一点空白:
awk '{ $2="" }1'
但是UUOC和grep
:
< 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/' | ...
答案 3 :(得分:0)
其他人以各种方式回应,但我想指出使用xargs来复用输出是一个相当糟糕的想法。
相反,你为什么不:
awk '$2=="100%" { sub("100%[[:space:]]*",""); print; print >>"fake.log"}' dbfake
这就是全部。你不需要grep,你不需要多个管道,而且你不需要为你输出的每一行分叉shell。
你可以做awk ...; print}' | tee fake.log
,但是如果awk也可以处理它,那么分叉三通没有多大意义。
答案 4 :(得分:0)
您只需要:
awk 'sub(/.*100% /,"")' dbfake | tee "fake.log"