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.