Adicione certas palavras a um arquivo

1

Estou usando este código para ler o número da linha 2 dos arquivos com o mesmo nome e incluído nas pastas (o nome dessas pastas incluídas no list.txt):

#!/bin/bash
in=/au/cl/tr/129/
inlist=/1/2/3
g=/1/5/file.txt

for i in $(cat $inlist/list.txt); do
 echo ${i}
 sed '2q;d' ${in}/${i}/${g};
 done > newfile.txt

a saída deste código (o conteúdo do newfile.txt) é a seguinte:

 folder 1  
 a 
 folder 2
 b
 folder 3
 c
 .
 .
 .
 .

a, b, c são o valor da segunda linha nos arquivos

como eu posso adicionar "i", que é o nome da pasta (incluída em list.txt), para a saída do código, então eu terei o valor na linha 2 e o nome da pasta na mesma linha que o seguinte

 folder1 (a) 
 folder2 (b)
 folder3 (c)
   .
   .
   .
   .
    
por Gilles 04.11.2014 / 22:31

2 respostas

1

Se você não precisa fazer isso em sed , o Perl pode ajudar. Ele armazena o nome do arquivo que está lendo na variável especial $ARGV e o número da linha na variável especial $. , portanto, isso deve funcionar:

...
for i in $(cat $inlist/list.txt); do
    perl -nle 'print "$ARGV ($_)" and last if ($.==2)' "${in}/${i}/${g}"
done

Para pegar várias linhas:

...
for i in $(cat $inlist/list.txt); do
    perl -nle '
        BEGIN{
            @lines = (2,3,5);
            print "$ARGV: "
        }
        print "Line $.: $_" if grep { $. == $_ } @lines;
        last if $. == $lines[-1];
    ' "${in}/${i}/${g}"
done

O texto acima imprimirá as linhas 2, 3 e 5. Isso pressupõe que a última entrada na matriz @lines seja a última linha que você deseja imprimir.

    
por 05.11.2014 / 02:56
4
#!/bin/bash
in=/au/cl/tr/129/
inlist=/1/2/3
g=/1/5/file.txt

for i in $(cat $inlist/list.txt); do
 echo -n "$i ("
 sed '2q;d' ${in}/${i}/${g};
 echo ")"
done > newfile.txt

-n opção diz ao echo para não imprimir o caractere de nova linha. Ref: link

    
por 04.11.2014 / 22:46