Como posso aplicar o comando cat (UNIX) individualmente a todos os arquivos em uma pasta?

2

Aqui está a situação:

Meu arquivo A.csv precisa ser concatenado individualmente com todos os outros * .csv's na pasta e cada uma das saídas precisa ter o mesmo nome que o * .csv.

Como posso fazer isso no terminal? Eu tenho que fazer isso 50 vezes e os outros csvs não têm nenhuma convenção de nomenclatura, então digitar manualmente é uma dor.

Os dados são sensíveis, então não posso brincar com a verificação se cat A.csv * csv > *. csv funciona. (Eu estou supondo que não vai)

    
por ankit 14.08.2013 / 06:36

1 resposta

3

Use um loop for em bash . Você pode se tornar um teste inofensivo primeiro:

#!/bin/bash
for f in *.csv; do
    if [ "$f" != 'A.csv' ]; then
        echo cat A.csv "$f" \> "$f.new"
    fi
done

Isso permite que você veja o que será executado, mas na verdade não o executa.

Observe que chamei o arquivo de saída $f.new . Você não pode garantir que o cat será executado antes de o shell começar a sobrescrever o arquivo. Então, eu recomendo que você faça isso, ou até mesmo escreva melhor os arquivos em outro diretório:

mkdir combined
for f in *.csv; do
    if [ "$f" != 'A.csv' ]; then
        echo cat A.csv $f \> "combined/$f"
    fi
done

E, claro, assim que estiver satisfeito, remova o eco (e o caractere > ):

cat A.csv "$f" > "combined/$f"
    
por 14.08.2013 / 07:02