bash awk первый 1-й столбец и 3-й столбец со всем после

Я работаю над следующим скриптом 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 , }' |

# echo out id and file name and log
xargs -rI % sh -c '{ echo %; echo "%" >> "fake.log"; }'

exit 0

этот скрипт работает нормально, но как я могу распечатать все в столбце $3, а затем все столбцы после?

5 ответов


в этом случае вы можете использовать cut вместо awk:

  cut -f1,3- -d ' '

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

если вы не возражаете немного пробелов:

awk '{ ="" }1'

но UUOC и grep:

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

если вы хотите, чтобы обрезать пробелы:

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


для удовольствия, вот еще один способ с помощью GNU sed:

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

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

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

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

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

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

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

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