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

この場合、awk の代わりに cut を使用できます。

  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

あなたに必要なのは:

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

他の人はさまざまな方法で回答しましたが、 xargs を使用して出力を多重化するのはかなり悪い考えであることを指摘したいと思います。

代わりに、次のことをお勧めします。

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

それで全部です。grep は必要ありません。複数のパイプも必要ありません。また、出力する行ごとにシェルをフォークする必要もありません。

を行うこともできますがawk ...; print}' | tee fake.log、 awk も処理できる場合、ティーをフォークすることにはあまり意味がありません。

于 2013-02-10T23:20:50.647 に答える