Yanıtlar:
... veya daha basit bir çözüm: cut -f 3- INPUTFILE
sadece doğru sınırlayıcıyı (-d) ekleyin ve aynı etkiyi elde edersiniz.
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
( printf
satırsonu karakterini yazdırmayacak print ""
, diğer alanlar yazdırıldıktan sonra yeni satır ekleyecek)
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, veren: 3 4 5 6 7 8 9 10
.
awk '{ print substr($0, index($0,$3)) }'
burada bulunan çözüm:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
Jonathan Feinberg'in cevabı her alanı ayrı bir satıra yazdırıyor. printf
Aynı satırdaki çıktı için kaydı yeniden oluşturmak için kullanabilirsiniz , ancak alanları bir sıçrayışla sola da taşıyabilirsiniz.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
NF
unutmayın, POSIX tarafından azaltmaya izin verilmez.
NF
, azaltılıp azaltılamayacağı konusunda sessiz görünüyor .
awk '{$1=$2=$3=""}1' file
Not: Bu yöntem 1,2,3 alanlarda "boşluklar" bırakacaktır ancak yalnızca çıktıya bakmak istiyorsanız bir sorun oluşturmaz.
1
geliyor? hangi anahtar kelimeyle arama yapmalıyım awk
?
{$1=$2=$3="";$0=$0;$1=$1}1
Aynı satırda örneğin 3'ten sonraki sütunları yazdırmak isterseniz, şunları kullanabilirsiniz:
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
Örneğin:
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
Yazdırılacak:
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
Gördüğümüz gibi, maaş bordrosu boşlukla bile doğru satırda görünüyor.
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Bu, verilen alan N'den önce olanı keser ve Nr alanı da dahil olmak üzere satırın geri kalanının tamamını yazdırır ve orijinal aralığı korur (yeniden biçimlendirmez). Alan dizisinin satırda başka bir yerde de görünmesi söz konusu değildir, daisaa'nın cevabındaki problem budur.
Bir işlev tanımlayın:
fromField () {
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
Ve bunu şu şekilde kullanın:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Çıktı, sondaki boşluklar dahil her şeyi korur
'/ N'nin kayıt ayırıcısı olduğu dosyalar için iyi çalışır, böylece satırların içinde yeni satır karakterine sahip olmazsınız. Diğer kayıt ayırıcılarla kullanmak istiyorsanız, şunu kullanın:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Örneğin. Onaltılık karakter nr kullanmadıkları sürece hemen hemen tüm dosyalarla iyi çalışır. Hatların içinde 1.
Aşağıdaki awk komutu, her satırın son N alanını ve satırın sonunda yeni bir satır karakteri yazdırır:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Aşağıda / usr / bin dizininin içeriğini listeleyen ve ardından son 3 satırı tutan ve ardından her satırın son 4 sütununu awk kullanarak yazdıran bir örnek bulun:
$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps
-rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic
-rwxr-xr-x 1 root root 35868448 May 22 2014 skype
$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
Normal bir ifade kullanarak aynı etkiyi kolayca gerçekleştirebilirsiniz. Ayırıcının bir boşluk olduğunu varsayarsak, şöyle görünür:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
Bu, deseni iki kez uzaklaştırır.
Perl çözümü:
perl -lane 'splice @F,0,2; print join " ",@F' file
Bu komut satırı seçenekleri kullanılır:
-n
girdi dosyasının her satırında döngü yapın, her satırı otomatik olarak yazdırmayın
-l
işlemeden önce yeni satırları kaldırır ve daha sonra tekrar ekler
-a
otomatik bölme modu - giriş satırlarını @F dizisine ayırın. Beyaz boşlukta bölmeye varsayılanlar
-e
perl kodunu çalıştır
splice @F,0,2
@F dizisinden 0 ve 1 sütunlarını temiz bir şekilde kaldırır
join " ",@F
her öğe arasında bir boşluk kullanarak @F dizisinin öğelerini birleştirir
Girdi dosyanız boşlukla sınırlı değil, virgülle ayrılmışsa, şunu kullanın: -F, -lane
Python çözümü:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
Bash'de konumsal parametrelerle aşağıdaki sözdizimini kullanabilirsiniz:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
Daha fazla bilgi edinin: Bash Hackers Wiki'de konumsal parametreleri yönetme
AWK'da sütunlara alanlar denir, dolayısıyla NF anahtar
tüm satırlar:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
yalnızca ilk satır:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>