Jumlahkan semua baris file csv


0

Saya telah mendapatkan file .csv, dengan beberapa angka, saya ingin mendapatkan file baru dengan jumlah baris dan satu kolom yang sama, dengan jumlah angka dari baris yang sesuai dalam file .csv yang asli.

Masukkan contoh (perhatikan spasi putih, saya harap ini tidak menjadi masalah)

 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 4,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 5,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 6,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0

Output yang diharapkan

2
4
5
6
7

Kode saya (tidak menghasilkan output apa pun):

    file_out="output.txt"
    file_in="input.txt"
    cmd3="sum_file=\$(awk -F, '
    {
        sum = 0; 
        for (i=1; i<=NF; i++) {
            sum += \$i;
        }
        print sum;
    }
    ' ${file_in})"
    echo $cmd3
    eval $cmd3
    eval "echo ${sum_file} > ${file_out}"

Anda dapat mengusulkan juga alat yang berbeda dari awk, tapi saya akan senang mengetahui mengapa kode saya tidak berfungsi, mungkin karena spasi putih (saya tidak berpikir begitu).


Mengapa Anda menyimpan kode Anda dalam variabel dan kemudian evalmemasukkannya? Tampaknya sangat berbelit-belit. Apakah ada persyaratan yang tidak Anda beritahukan kepada kami?
glenn jackman

Tunggu, output apa yang Anda harapkan? Ke layar? Anda mengarahkan ke file output. Apakah file itu kosong?
glenn jackman

@glennjackman, masalahnya ada di baris terakhir. Seharusnya saya gunakan \${sum_file}. Saya menggunakan eval untuk keperluan debug, karena mudah untuk menggemakan baris. Tetapi dengan melakukan itu, saya memperkenalkan bug baru :( Setidaknya sekarang sudah dipecahkan
Nisba

Jawaban:


2

Anda tidak memerlukan nilai sementara. Cukup jalankan awkdan redirect output ke file.

file_out="output.txt"
file_in="input.txt"
awk -F, '
{
    sum = 0; 
    for (i=1; i<=NF; i++) {
        sum += \$i;
    }
    print sum;
}
' "${file_in}" > "${file_out}"

1
Anda juga tidak perlu memiliki nama file dalam variabel. Jika Anda melakukannya, mereka harus berada di dalam tanda kutip ganda. (Tampaknya berfungsi dengan baik selama nama file Anda sepele, tetapi ketika rusak, kita mendapatkan satu lagi di tempat pembuangan pertanyaan pemula yang putus asa tentang mengapa ini tidak bekerja pada nama file dengan tanda bintang, spasi, tanda kurung dll di nama mereka.)
tripleee

Poin bagus, @tripleee
Tomasz Jakub Rup

sum += \$i;menyebabkan kesalahan sintaks kecuali bagian dari mis cmd3="...".
simlev

1

awk:

awk -F, '{sum=0; for (i=1; i<=NF; i++) {sum+= $i} print sum}' input.txt > output.txt

perl:

perl -F, -lane '$s=0; $s+=$_ for @F; print $s' input.txt > output.txt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.