mescla o texto do arquivo com o nome do arquivo

3

Eu tenho dois arquivos de texto. O primeiro "file1.txt" tem conteúdo:

Apple
Orange
Banana

enquanto o segundo arquivo "file2.txt" tem conteúdo:

monday
tuesday
wednesday

Eu quero combiná-los em um arquivo e sua saída é:

Apple       File1.txt
Orange      File1.txt
Banana      File1.txt
monday      File2.txt
tuesday     File2.txt
wednesday   File2.txt
    
por user247444 21.08.2017 / 11:31

3 respostas

11

Isso é bem trivial com awk :

$ awk '{print $0,FILENAME}' File*.txt
Apple File1.txt
Orange File1.txt
Banana File1.txt
monday File2.txt
tuesday File2.txt
wednesday File2.txt

Se você quiser uma guia em vez de um espaço entre a linha de entrada e o nome do arquivo, adicione -v OFS='\t' à linha de comando para definir o OFS (Output Field Separator):

awk -v OFS='\t' '{print $0,FILENAME}' File*.txt

ou use:

awk '{print $0 "\t" FILENAME}' File*.txt

Isso pressupõe que os nomes dos arquivos não contenham = caracteres. Se você não pode garantir que os nomes dos arquivos não contenham = caracteres, você pode mudar isso para:

awk '{print $0 "\t" substr(FILENAME, 3)}' ./File*.txt

Embora com GNU awk pelo menos, você receberia avisos se o nome do arquivo continha bytes não formando caracteres válidos (o que você poderia resolver corrigindo a localidade para C (com LC_ALL=C awk... ) embora isso também tenha o efeito colateral de potencialmente alterar a linguagem de outras mensagens de erro, se houver).

    
por 21.08.2017 / 11:39
3

com perl :

perl -lpe '$_ .= "\t$ARGV"' File*.txt

(observe que tudo bem com um glob como File*.txt , mas pode ser perigoso com os diferentes ).

    
por 21.08.2017 / 12:58
1

Para uso interativo na linha de comando, uma das coisas mais fáceis de digitar é

grep . File*.txt

Como o regex . corresponde a qualquer caractere, todas as linhas não vazias de todos os arquivos corresponderão e serão impressas com o nome do arquivo como um prefixo.

É ótimo para casos de uso, como verificar algumas configurações do kernel que são armazenadas com uma configuração por arquivo:

$ grep . /sys/kernel/mm/transparent_hugepage/*
/sys/kernel/mm/transparent_hugepage/defrag:[always] defer defer+madvise madvise never
/sys/kernel/mm/transparent_hugepage/enabled:[always] madvise never
/sys/kernel/mm/transparent_hugepage/hpage_pmd_size:2097152
grep: /sys/kernel/mm/transparent_hugepage/khugepaged: Is a directory
/sys/kernel/mm/transparent_hugepage/shmem_enabled:always [within_size] advise never deny force
/sys/kernel/mm/transparent_hugepage/use_zero_page:1
    
por 21.08.2017 / 18:17

Tags