usando awk em apenas arquivos que START com 'xyz'

0

Eu tenho 3 arquivos em um diretório: xyz1.txt , xyz2.txt , rst_xyz.txt e quero trabalhar com APENAS os dois primeiros (aqueles que começam com xyz). O comando ls | awk '/xyz/{print $1}' retornará todos os três. Quais alterações eu posso fazer no comando para especificar SOMENTE os arquivos xyz *? Eu tentei ls | awk '/^xyz/{print $1}' pensando que isso iria garantir que o arquivo fosse iniciado com xyz, mas isso não exclui rst_xyz.txt .

    
por drjrm3 20.01.2015 / 19:21

3 respostas

2

Não analise ls !

Você quer

awk '...' xyz*

Se, por alguma razão muito estranha, você quiser fazer isso inteiramente dentro do awk:

awk 'FILENAME ~ /^xyz/ { .... }' *
    
por 20.01.2015 / 19:47
1

não há necessidade de awk. basta usar o nome do arquivo glob:

ls xyz*

O mais provável é que você queira enviar os nomes dos arquivos para trabalhar neles? assim, talvez?

ls xyz* | some other commands

Nesse caso, é melhor usar um loop for.

for filename in xyz*
do
  some other commands "$filename"
done

observe que na primeira variante os nomes dos arquivos virão como um fluxo para stdin de some other commands enquanto no loop for os nomes dos arquivos virão um por um como um argumento de linha de comando para some other command .

    
por 20.01.2015 / 19:28
1
ls | awk '/^xyz/'

Sua solução original estava faltando apenas o ^ no regep, que ancora a correspondência ao início da linha. Você não precisa de um bloco print porque a ação padrão ao encontrar uma correspondência é imprimir a linha. Se você quer ser explícito, pode escrever:

ls | awk '/^xyz/ {print $0}'

Você deve usar $0 em vez de $1 , caso o nome do arquivo contenha espaços (embora, se o nome do arquivo contiver nova linha, isso ainda o tratará como vários nomes).

    
por 20.01.2015 / 22:37