GNU/Linux >> Belajar Linux >  >> Linux

Sisipkan Baris Baru Dengan Nilai yang Hilang (na)?

Saya ingin menyisipkan baris baru dalam file teks jika ada nilai yang hilang.
Saya memiliki misalnya file teks berikut (A.txt), di mana baris 5 tidak ada. Selain itu, karena file harus memiliki 12 baris, baris 11-12 juga hilang.

1 2.30
2 3.01
3 3.22
4 3.34
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02

Output yang saya harapkan adalah sebagai berikut. Untuk kasus yang hilang, baris harus ditambahkan dengan nomor dan NA. Seperti yang Anda lihat, ini terjadi seperti yang diinginkan pada baris 5, 11 dan 12:

1 2.30
2 3.01
3 3.22
4 3.34
5 NA
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02
11 NA
12 NA

Saya dapat melakukan ini dengan menggunakan skrip berikut:

f1=/my-directory/
echo "new file" > "$f1"/newfile.txt  

for i in {1..12}; do
l=$(awk '{print $1}' /"$f1"/A.txt | grep -wE ^$i /"$f1"/A.txt)
if grep --quiet -wE ^$i /"$f1"/A.txt; then echo "$l" >> "$f1"/newfile.txt; else echo "$i NA" >> "$f1"/newfile.txt; fi

done

Ini bekerja dengan baik. Namun masalahnya adalah saya perlu melakukan ini untuk sekitar 600 file yang berisi lebih dari sekitar 160000 baris. Oleh karena itu, solusi loop akan membutuhkan terlalu banyak waktu untuk mencari di semua lini. Pertanyaan saya adalah:apakah ada solusi sederhana yang dapat melakukan ini?

Jawaban yang Diterima:

Anda dapat melakukannya dengan awk naskah:

awk '{ while (NR + shift < $1) { print (NR + shift) " NA"; shift++ }; print } END { shift++; while (NR + shift < 13) { print (NR + shift) " NA"; shift++ } }' /tmp/test1

akan menghasilkan output yang diperlukan untuk /tmp/test1 (ganti dengan setiap file yang ingin Anda proses).

Dalam bentuk yang lebih mudah dibaca:

#!/usr/bin/awk -f
{
    while (NR + shift < $1) {
        print (NR + shift) " NA"
        shift++
    }
    print
}
END {
    shift++
    while (NR + shift < 13) {
        print (NR + shift) " NA"
        shift++
    }
}

Simpan ini sebagai file, katakan fill-missing , buat itu dapat dieksekusi, lalu Anda cukup menjalankannya

./fill-missing /tmp/test1

Script memproses setiap baris, melacak delta yang diharapkan dengan nomor baris saat ini di shift . Jadi untuk setiap baris, jika baris yang disesuaikan saat ini tidak cocok dengan angka pertama dalam baris, nomor baris yang sesuai akan dicetak diikuti dengan NA dan menambah delta; setelah nomor baris cocok, ia mencetak baris saat ini. Di akhir proses, ia mencetak setiap baris yang hilang yang diperlukan untuk mencapai 12.

Terkait:Waktu habis dalam skrip Shell?
Linux
  1. Apa yang baru dengan rdiff-backup?

  2. Menghitung jaringan baru dengan Nmap

  3. Dengan Perintah "kucing" Linux, Bagaimana Hanya Menampilkan Baris Tertentu Dengan Angka?

  1. Hapus Baris Berturut-turut Dalam Csv Dengan Nilai Duplikat Dalam Satu Bidang, Tapi Pertahankan Baris Terakhir?

  2. Duplikat, Dengan Beberapa Perubahan Kecil, Beberapa Baris Dalam File Teks?

  3. Menggabungkan File Dan Menyisipkan Baris Baru Di Antara File

  1. Ganti Rentang Garis Dengan Rentang Garis (sed Atau Lainnya)?

  2. Bagaimana cara menyisipkan baris baru di skrip shell Linux?

  3. ganti baris dalam satu file dengan baris lain dengan nomor baris