1'den 3'e kadar olan seçeneklerde birden fazla boşlukla ilgili sorunlar var (ancak basittir). Birden çok beyaz alanı sorunsuz bir şekilde işleyen 4. ve 5. seçenekleri geliştirmenin nedeni budur. Elbette, 4 veya 5 numaralı seçenekler n=0
her ikisiyle birlikte kullanılırsa, n=0
bölünme olmadığı anlamına geldiği için öndeki beyaz boşlukları koruyacaktır .
seçenek 1
Basit bir kesim çözümü (tek sınırlayıcılarla çalışır):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
seçenek 2
Bir awk yeniden hesaplamaya zorlamak bazen eklenen boşlukların problemini çözer (awk'nin bazı sürümleriyle çalışır):
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
3. Seçenek
Biçimlendirilmiş her alanın yazdırılması printf
daha fazla kontrol sağlayacaktır:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }'
4 5 6 7 8
Ancak, önceki yanıtların tümü alanlar arasındaki tüm FS'leri OFS olarak değiştirir. Buna birkaç çözüm geliştirelim.
4. seçenek
Alanları ve sınırlayıcıları kaldırmak için sub içeren bir döngü daha taşınabilirdir ve FS'nin OFS'ye değiştirilmesini tetiklemez:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for(i=1;i<=n;i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 '
4 5 6 7 8
NOT: "^ [" FS "] *" başında boşluklar olan bir girişi kabul etmek içindir.
Seçenek 5
Fazladan baştaki veya sondaki boşluk eklemeyen bir çözüm oluşturmak ve gensub
GNU awk işlevini kullanarak mevcut beyaz boşluğu korumak oldukça mümkündür , aşağıdaki gibi:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4 5 6 7 8
Ayrıca, bir sayı verilen bir alan listesini değiştirmek için de kullanılabilir n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ a=gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1);
b=gensub("^(.*)("a")","\\1",1);
print "|"a"|","!"b"!";
}'
|4 5 6 7 8 | ! 1 2 3 !
Tabii ki, böyle bir durumda, OFS, çizginin her iki kısmını da ayırmak için kullanılır ve alanların sondaki beyaz boşluğu hala yazdırılır.
Not1: ["FS"]*
giriş satırında baştaki boşluklara izin vermek için kullanılır.
cut -f3-
?