2013-02-10 2 views
6

Я работаю на следующий сценарий Баш:Баш AWK первый 1-й столбец и 3-ю колонку со всем после

# 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, а затем все столбцы после печати?

ответ

11

Вы можете использовать вырезать вместо AWK в этом случае:

cut -f1,3- -d ' ' 
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/' | ... 
0

Другие отвечали по-разному, но я хочу что использование xargs для мультиплексирования - довольно плохая идея.

Вместо этого, почему бы вам не:

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

Это все. Вам не нужен grep, вам не нужно несколько каналов, и определенно вам не нужно использовать fork shell для каждой строки, которую вы выводите.

Вы можете сделать awk ...; print}' | tee fake.log, но есть немного смысла в forking tee, если awk может справиться с этим.

0

Все, что вам нужно:

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

 Смежные вопросы

  • Нет связанных вопросов^_^