2013-02-10 27 views
6

tôi đang làm việc trên các tập lệnh bash sau:bash awk cột 1 đầu tiên và cột thứ 3 với tất cả mọi thứ sau

# 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 

kịch bản này hoạt động ok, nhưng làm thế nào để in tất cả mọi thứ trong cột $ 3 và sau đó tất cả các cột sau?

Trả lời

11

Bạn có thể sử dụng cắt thay vì awk trong trường hợp này:

cut -f1,3- -d ' ' 
1

Nếu bạn không nhớ một chút khoảng trắng:

awk '{ $2="" }1' 

Nhưng UUOCgrep:

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

Nếu bạn muốn cắt mà khoảng trắng:

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


Đối với niềm vui, đây là một cách khác để sử dụng GNU sed:

< dbfake sed -r '/100%/s/^(\S+)\s+\S+(.*)/\1\2/' | ... 
0

Khác phản ứng theo những cách khác nhau, nhưng tôi muốn điểm mà sử dụng xargs để multiplex đầu ra là ý tưởng khá xấu.

Thay vào đó, tại sao bạn không:

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

Đó là tất cả. Bạn không cần grep, bạn không cần nhiều ống, và chắc chắn bạn không cần phải ngã ba vỏ cho mỗi dòng bạn đang xuất ra.

Bạn có thể làm awk ...; print}' | tee fake.log, nhưng không có nhiều điểm trong việc rèn luyện tee, nếu awk cũng có thể xử lý nó.

0

Tất cả những gì bạn cần là:

awk 'sub(/.*100% /,"")' dbfake | tee "fake.log"