Bir alanın sonundan itibaren sayılan metin satırındaki kesilmesi (seçilmesi)


32

Cut komutunu kullanarak satırdan alan seçmeyi biliyorum. Örneğin, aşağıdaki verileri verin:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

Bu komut:

cut -d, -f2 # returns the second field of the input line

İade:

b
g
l

Sorum: Sondan itibaren ikinci alanı nasıl seçebilirim ? Önceki örnekte, sonuç şöyle olacaktır:

d
i
n

Yanıtlar:


52

Önce ve sonra giriş Ters cutile rev:

<infile rev | cut -d, -f2 | rev

Çıktı:

d
i
n

1
Bin klasörümde birçok küçük parçacık var. rcut kesinlikle bunun içindir: #! / bin / bash rev | "$ @" kesilmiş | rev
John Allsup

2
cutNegatif alan endekslerini (Python gibi) alamaması çok kötü .
Keith Devens

10

Bunu ile yapmayı deneyin :

awk -F, '{print $(NF-1)}' file.txt

Veya kullanarak :

perl -F, -lane 'print $F[-2]' file.txt

Veya kullanarak (teşekkürler manatwork):

ruby -F, -lane 'print $F[-2]' file.txt

Veya kullanarak bash(teşekkürler manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

Veya kullanarak :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bashdeğil bunun için sabit sütun sayısını gerekir: while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
Manatwork

1
Eğer değiştirirseniz BTW, üçüncü çözüm de çalışır perlile ruby.
Manatwork

Teşekkürler, rubyeklendi, bashdüzenlendi.
Gilles Quenot

1
Dördüncü alan -veya ile başlayabilirse (çevreye, kabuğa veya kabuğun nasıl derlendiğine bağlı olarak) ters eğik çizgi karakterleri içerebilir, o zaman echobir seçenek değildir. catBeslemeden önce neden hiçbir şeyle file.txttemas etmemelisiniz ? İhtiyacınız yerine içinde ve . Negatif alt simgeler çalışmak ancak son sürümlerinde ve . Eski versiyonlarda, kullanabilirsinizpythonread -Aread -aksh93zshzshksh93bash${d: -2:1}
Stéphane Chazelas

2
@StephaneChazelas, bence ${d[@]: -2:1}son cümle içinde demek istiyorsun .
Manatwork

0

Sed kullanarak:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

Çıktı:

d
i
n

açıklama

  • ([^,]*,)* herhangi bir virgül olmayan karakterin ardından virgül, yani herhangi bir sayıda sütunla eşleşir.
  • ([^,]*) bir sütunla eşleşir.
  • (,[^,]*){1}Eğer nicelik değiştirirseniz, sonunda bir sütun maçları {1}için {2}bu ucundan vb ikinci sütunu eşleşir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.