adiciona o nome do arquivo como cabeçalho da coluna

1

Eu tenho um diretório com tabelas no formato txt e gostaria de adicionar o nome do arquivo como o cabeçalho da segunda coluna, por exemplo:

arquivo_1.txt

row_1 1 
row_2 0 
row_3 1  
row_4 1 
row_5 1 
row_6 1

output.txt

rows  file_1
row_1  1 
row_2  0 
row_3  1  
row_4  1 
row_5  1

Eu estava pensando em algo assim

sed 1 's/top_row/$file_name/1' < "$file";
    
por erick rodriguez 10.10.2018 / 19:49

5 respostas

1

Isto escreve uma linha com rows file_1.txt e depois filtra o arquivo inteiro:

 echo "rows $file"; cat "$file"

Se você quiser descartar a extensão do arquivo da saída, como mostrado acima, use basename :

 echo "rows $(basename $file .txt)"; cat "$file"
    
por 10.10.2018 / 20:01
1
for file in ./file_*.txt
do
  awk 'NR==1 { print "rows", FILENAME }; 1' "$file" > temp && mv temp "$file"
done

Como alternativa, com um sed que suporte -i para edição no local:

for file in ./file_*.txt
do
  sed -i "1i\
rows $file" "$file"
done
    
por 10.10.2018 / 20:02
0

Supondo que file_*.txt corresponderia a todos os arquivos que você deseja processar e que os arquivos usam um caractere de tabulação para o delimitador:

tmpfile=$(mktemp)
for filename in file_*.txt; do
    { printf 'rows\t%s\n' "$filename"; cat "$filename"; } >$tmpfile &&
    mv "$tmpfile" "$filename"
done

Isso iteraria os nomes de arquivos correspondentes e, para cada arquivo, seria exibida uma linha contendo o cabeçalho seguido do conteúdo do próprio arquivo em um arquivo temporário que, se tudo corresse bem, substituiria o arquivo original.

Observe que isso modifica os arquivos originais. Na sua pergunta, você dá um exemplo e diz que isso deve ser enviado para output.txt , mas não está claro onde gravar o resultado para todos os outros arquivos, então fui com essa abordagem.

    
por 10.10.2018 / 22:01
0

algum perl incrutável, apenas por diversão

perl -i -pe '$.==1&&do{($f=$ARGV)=~s/\..*?$//;$_="rows $f\n$_"};close ARGV if eof' *.txt
    
por 10.10.2018 / 22:03
0

portável e GNU válido sed, sem i ou a necessário, feito com s/// .

file=TheFileName;  sed -i '1{h;s/.*/rows '"$file"'/;G}' "$file"

Expandido e explicado, remova comentários e use-o em antigos seds.

sed -i '                           # start sed script.
        1                          # Only on the first line.
          {                        # Execute this commands.
            h                      # hold the first line.
            s/.*/rows '"$file"'/   # Transform to line to insert.
            G                      # append a newline first line in hold.
          }                        # That's all.
       ' "$file"                   # Script end and file name edited.
    
por 11.10.2018 / 08:22

Tags