2013-04-22 23 views
6

awk ve sed kullanarak bir dizi satır elde etmeyi biliyorum. Ayrıca awk ve sed kullanarak her satırın nasıl yazdırılacağını biliyorum. Bununla birlikte, ikisi nasıl birleştirileceğini bilmiyorum.awk, sed veya diğer unix komutlarını kullanarak her nth aralıklı bir dizi satırı nasıl alabilirim?

Örneğin, 1780000 satırlı bir dosyam var.

her 17800 hattı için, ben 17800 çizgiyi artı bundan sonra iki yazdırmak istiyorum. Ben 1780000 hatları ile bir dosya var ve 1780000 de 1'den başlar ve biterse

Yani, bu yazdırır:

1 
2 
3 
17800 
17801 
17802 
35600 
35601 
35602 
# ... and so on. 

kimse her n aralığı awk kullanarak hattının bir dizi nasıl biliyor mu, sed, ya da diğer unix komutu? GNU kullanma

cevap

4

sed:

sed -n '0~17800{N;N;p}' input 

Anlamı,

For every 17800th line: 0~17800 
    Read two lines: {N;N; 
    And print these out: p} 

Biz de ilk üç satırı ekleyebilirsiniz: Awk kullanma

sed -n -e '1,3p' -e '0~17800{N;N;p}' input 

, bu daha basit olacaktır:

awk 'NR%17800<3 || NR==3 {print}' input 
+0

Çok teşekkür ederim. Yani, hattan 100 satır basmak istersem, 100 N'ye ihtiyacım var; ya da daha kolay bir yolu var mı? –

+0

Evet, 100 N'ye ihtiyacın var, bu durumda awk gitmenin yolu olacak. – perreal

+0

ancak bir betik de kullanabilirsiniz. Scr komutunu oluşturmak için – perreal

2
$ cat file 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

$ awk '!(NR%3)' file 
3 
6 
9 

$ awk -v intvl=3 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
3 
4 
----- 
6 
7 
----- 
9 
10 

$ awk -v intvl=4 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
----- 
8 
9 

$ awk -v intvl=4 -v delta=3 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
6 
----- 
8 
9 
10 
İlgili konular