2016-03-23 28 views
1
1,n1,abcd,1234 
2,n2,abrt,5666 
,h2,yyyy,123x 
3,h2,yyyy,123y 
3,h2,yyyy,1234 
,k1,yyyy,5234 
4,22,yyyy,5234 

yukarıdaki girdi dosyası benim abc.txt dosyasıdır, eksik olan ilk sütun değerinin bir sonraki satırın ilk değeriyle doldurulmasını istiyorum. örnek:Kabuk komut dosyasında bir sonraki satır içeriğiyle boş yeri değiştirmek için yukarıdaki kod içeriği

3,h2,yyyy,123x 
3,h2,yyyy,123y 

aşağıda gibi çıktı istiyoruz

1,n1,abcd,1234 
2,n2,abrt,5666 
3,h2,yyyy,123x// the missing first column value 3 should fill with second row first value 
3,h2,yyyy,123y 
3,h2,yyyy,1234 
4,k1,yyyy,5234 
4,22,yyyy,5234 

AWK veya kabuk komut dosyası bazı diğer alternatif yardımıyla bu nasıl uygulanır, yardım edin.

+1

Her seferinde yalnızca bir satırın değeri eksik olacak mı? Yoksa iki ya da daha fazla ardışık çizgi ilk alanı kaçırır mı? –

cevap

1

kullanma awk Yapabileceğiniz:

awk -F, '$1 ~ /^ *$/ { 
    p=p RS $0 
    next 
} 
p!="" { 
    gsub(RS " +", RS $1, p) 
    sub("^" RS, "", p) 
    print p 
    p="" 
} 1' file 

1,n1,abcd,1234 
2,n2,abrt,5666 
3,h2,yyyy,123x 
3,h2,yyyy,123y 
3,h2,yyyy,1234 
4,k1,yyyy,5234 
4,22,yyyy,5234 
+0

, h2, yyyy, 123x , h2, yyyy, 123y 3, h2, yyyy, 1234 ilk iki satırı da boş bırakmalı, sonra da bir sonraki satırdaki değeri almalıdır. Lütfen – jcrshankar

+0

numaralı telefondan yardım edin. güncellenmiş bir cevap şimdi – anubhava

+0

yardımınız için teşekkürler, ama bir satırını tutmak ve diğer satırı siliyor – jcrshankar

1

Ben dosyayı geri ve sonra önceki hattından değerini yerini alacak: Bu aynı zamanda üzerinde eksik değerleri dolduracaktır

tac filename | awk -F, '$1 ~ /^[[:blank:]]*$/ {$1 = prev} {print; prev=$1}' | tac 

Birden çok satır. GNU için

0

sed:

/^ ,/ { # If the line starts with 'space comma' 
    N  # Append the next line 

    # Extract the value before the comma, prepend to first line 
    s/ \(.*\n\)\([^,]*\)\(.*\)/\2\1\2\3/ 
} 

BSD Kapanış ayracı önce fazladan noktalı virgül gerektirecektir sed:

$ sed '/^ ,/{N;s/ \(.*\n\)\([^,]*\)\(.*\)/\2\1\2\3/}' infile 
1,n1,abcd,1234 
2,n2,abrt,5666 
3,h2,yyyy,123x 
3,h2,yyyy,123y 
3,h2,yyyy,1234 
4,k1,yyyy,5234 
4,22,yyyy,5234 

sed komutu aşağıdakileri yapar.

Bu yalnızca eksik değerleri olan bitişik olmayan satırlarla çalışır.