Awk ile çoğu çözüm bir boşluk bırakır. Buradaki seçenekler bu sorunu önler.
seçenek 1
Basit bir kesim çözümü (sadece tek sınırlayıcılarla çalışır):
command | cut -d' ' -f3-
seçenek 2
Bir awk re-calc'i zorlamak bazen ilk alanları kaldırarak kalan ek boşlukları (OFS) kaldırır (awk'ın bazı sürümleriyle çalışır):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Seçenek 3
Biçimlendirilmiş her alanın yazdırılması printf
daha fazla kontrol sağlar:
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8
Ancak, önceki tüm yanıtlar alanlar arasındaki tüm tekrarlanan FS'leri OFS olarak değiştirir. Bunu yapmayan birkaç seçenek oluşturalım.
Seçenek 4 (önerilir)
Öndeki alanları ve sınırlayıcıları kaldırmak için alt içeren bir döngü.
Ve boşluk yerine FS değerini kullanarak (değiştirilebilir).
Daha taşınabilir mıdır ve OFS FS değişikliği tetiklemez:
NOT:^[FS]*
öncü boşluklu bir giriş kabul etmektir.
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3 4 5 6 7 8
Seçenek 5
Ekstra (öncü veya sondaki) boşluk eklemeyen bir çözüm oluşturmak ve gensub
GNU awk işlevini kullanarak mevcut boşlukları korumak mümkündür :
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{ print(gensub(a""b""c,"",1)); }'
3 4 5 6 7 8
Ayrıca, bir sayı verilen bir grup alanı takas etmek için de kullanılabilir n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{
d=gensub(a""b""c,"",1);
e=gensub("^(.*)"d,"\\1",1,$0);
print("|"d"|","!"e"!");
}'
|3 4 5 6 7 8 | ! 1 2 !
Tabii ki, bu durumda OFS, hattın her iki parçasını ayırmak için kullanılır ve alanların sondaki beyaz boşluğu hala yazdırılır.
NOT: [FS]*
giriş satırında önde gelen boşluklara izin vermek için kullanılır.
grep | awk
birawk '/!/ { print $2 }'