Como posso fazer Sequenciamento de nomes de arquivos com a ajuda de Loops

1

minha intenção é manter o código o mais simples possível. Aqui há 5 arquivos a saber

A_1.CSV, A_2.CSV, A_3.CSV, A_4.CSV, A_5.CSV

O código abaixo recupera a primeira linha em um arquivo CSV.

Código: head.sh (nome do arquivo)

awk -F, 'NR==1 {print $0}' A_1.CSV > Header.csv
awk -F, 'NR==1 {print $0}' A_2.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_3.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_4.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_5.CSV >> Header.csv

Pergunta:

No código acima, apenas o nome do arquivo muda de A_1 para A_2 e assim por diante. Como posso tornar o código simples com loops?

Exemplo:

 for (i=1;i<=5;i++)
      {
       A_[i].CSV >> Header.csv
      }

Eu não sei como fazer essa lógica com scripts de shell.

CÓDIGO ATUALIZADO:

Arquivos no diretório: / home / thiyagu / Desktop /

for file in 'A_*.CSV'
do
awk -F, 'NR==1 {print $0}' $file >> Newheader.csv
done
    
por Thiyagu 05.03.2015 / 08:54

3 respostas

1

e

 awk 'FNR==1' A_*.csv > Header.csv

onde

  • FNR é o registro do número do arquivo
  • a ação padrão é imprimir a linha while
  • Larguei -F, porque você não se importa com o campo individual (se você tem outra coisa a fazer, no entanto, pode adicioná-lo de volta)
por 05.03.2015 / 09:33
-1

Algo parecido com isso funcionará:

for file in 'ls A_*.csv'
do
awk -F, 'NR==1 {print $0}' $file >> Header.csv
done

Este é um loop básico de script de shell. Você pode encontrar esses tutoriais on-line, se você procurar por eles.

    
por 05.03.2015 / 09:16
-1

Aspas simples impedem a expansão: cada caractere em uma cadeia de aspas simples é interpretado literalmente (exceto ' em si que termina a string). Portanto, quando você quiser que * aja como um caractere curinga, deixe-a fora das aspas. (Aspas duplas também evitam que * atue como curinga).

for file in A_*.CSV …

O resto do seu código atualizado provavelmente está ok, mas você deve coloca aspas duplas em torno das substituições de variáveis , caso contrário, mais cedo ou mais tarde, ele vai te morder.

Você pode fazer o redirecionamento fora do loop. Isso é um pouco mais rápido.

for file in A_*.CSV
do
  awk -F, 'NR==1 {print $0}' "$file"
done >> Newheader.csv

Este snippet é anexado a Newheader.csv . Se você quiser sobrescrever o arquivo quando ele já existir, como em seu código original, substitua >> por > .

Existem várias maneiras de simplificar seu script, se tudo o que você deseja é imprimir a primeira linha de vários arquivos. Como você está imprimindo a primeira linha, -F, não é usado. Além disso, você pode usar head -n 1 em vez de awk 'NR == 1 {print $0}' . No Linux (mas não em todas as variantes do Unix), para imprimir apenas a primeira linha de vários arquivos, você pode usar head sem nenhum loop:

head -q -n 1 A_*.CSV >Newheader.csv

Você também não precisa de um loop com o awk, veja a resposta do Archemar .

    
por 06.03.2015 / 01:01