bash awk第一列和第三列包含所有内容

时间:2013-02-10 22:25:25

标签: bash awk xargs

我正在处理以下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列中打印所有内容,然后在所有列之后打印?

5 个答案:

答案 0 :(得分:12)

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

  cut -f1,3- -d ' '

答案 1 :(得分:9)

awk '{ $2 = ""; print }' # remove col 2

答案 2 :(得分: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/' | ...

答案 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"