Üstbilgi adına göre sütunları awk olarak yazdır


13

Böyle bir metin dosyam var

foo bar baz
1   a   alpha
2   b   beta
3   c   gamma

Awk ile 1 ve 3 gibi belirli sütunları yazdırmak için kullanabilirim {print $1, $3}, ancak bunun gibi bir şey yerine sütunun başlığını belirterek yazdırılacak sütunları belirtmek istiyorum {print $foo, $baz}. Bu, dosyayı açıp hangi sütunun hangisi olduğunu görmek için sütunları manuel olarak saymam gerekmediği için yararlıdır ve sütun numarası veya sırası değişirse komut dosyasını güncellemem gerekmez. Bunu awk (veya başka bir kabuk aracı) ile yapabilir miyim?

Yanıtlar:


18
awk '
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{ print $(f["foo"]), $(f["baz"]) }
' file
foo baz
1 alpha
2 beta
3 gamma

Bu son derece yararlı bir deyim. E-tablolarda çok fazla veri var ve farklı e-tablolar, ilgilendiğim sütunların ortak bir alt kümesine sahip olabilir, ancak tüm e-tablolarda veya aralarında / aralarında aynı sayıda diğer sütunlarla aynı sırada olması gerekmez. bunları CSV veya benzeri olarak kullanın ve ardından sütun numaraları yerine sütun adlarını kullanarak bir awk betiği çalıştırın.


Bu çok teşekkürler ve benim amacım için çalışıyor. Bunun acemi bir acemi için nasıl çalıştığını açıklayabilir misiniz? F [$ i] sözdizimi ne yapıyor ve awk hangi sütunları dizelerle eşleştiriyor?
AlexLipp

Rica ederim. Bu kesinlikle temel awk sözdizimi, awk man sayfasındaki (veya google) alanlara ve dizilere bakın. Ekle print ive print $ive print vb f döngüsünde [$ i] `ifadeleri, eğer yardımcı olur oluyor whats iz.
Ed Morton

1

Sen istemek awk, ama aynı zamanda bunun için daha özel bir araç kullanabilirsiniz: csvtool.

csvtool -t ' ' -u ' ' namedcol foo,baz file

veya

csvtool -t ' ' -u ' ' col 1,3 file

1

Dosyanın aşağıdakileri kullanarak bir TSV ("sekmeyle ayrılmış değerler") dosyası olduğunu varsayarsak csvkit:

$ csvcut -t -c foo,baz file.tsv
foo,baz
1,alpha
2,beta
3,gamma

Çıktı düzgün bir şekilde CSV olarak biçimlendirilecek, ancak kolayca tekrar TSV olarak değiştirilebilir:

$ csvcut -t -c foo,baz file.tsv | csvformat -T
foo     baz
1       alpha
2       beta
3       gamma

-cSeçeneği csvcutde sayıları ve aralıkları sunar ve ayrıca kullanılabilir yeniden giriş verilerinin sütun (genellikle standart in kaçırma özelliği cutyardımcı).

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.