Saya memiliki matriks yang terlihat seperti berikut:
Masukan :
A B C D E F G H I
0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 1 0 0 0 1 0 0
1 0 0 1 0 0 0 1 0
1 0 0 0 1 1 1 0 0
Dan saya ingin mengekstrak setiap baris daftar huruf yang sesuai dengan nilai 1.
Keluaran :
E,I
D
D
A
A,C,G
A,D,H
A,E,F,G
Saya telah mencoba untuk membagi header dan mencocokkan kata-kata dengan angka tetapi saya gagal.
text-processing
awk
fusion.slope
sumber
sumber
NR == 1 { split($0,values) }
next
di akhir baris pertama sehingga Anda tidak perlu menguji kondisi yang berlawanan untuk baris berikutnya.NR > 2
menjadiNR > 1
.awk
, atau tempel kode ke dalam file dan jalankan denganawk -f that.script.file input-file
Satu lagi dengan
perl
-a
pilihan untuk membagi jalur input pada spasi putih, tersedia dalam@F
larikif($. == 1){ @h=@F }
simpan tajuk jika baris pertama@i = grep {$F[$_]==1} (0..$#F)
simpan indeks jika entri1
print join ",",@h[@i]
hanya cetak indeks dari array tajuk menggunakan,
sebagai pemisahsumber
Masih untuk bersenang-senang, a
zsh
versi:${a:^b}
ritsleting dua array, sehingga Anda mendapatkan A 0 B 0 C 0 D 0 E 1 F 0 G 0 H 0 I 1${(j<>)...}
bergabung dengan elemen tanpa apa-apa di antaranya sehingga menjadi A0B0C0D0E1F0G0H0I1${...//(?0|1)}
kami menanggalkan?0
dan1
dari itu sehingga menjadi EI:${(s<>)...}
pisah apa-apa untuk mendapatkan larik satu elemen per huruf: EI${(j<,>)...}
bergabunglah dengan,
-> E, I.sumber
zsh
, shell yang berbeda daribash
(dan jauh lebih kuat, dan dengan desain yang jauh lebih baik jika Anda bertanya kepada saya).bash
telah meminjam hanya sebagian kecil darizsh
'fitur s (seperti{1..4}
,<<<
,**/*
) bukan yang disebutkan di sini, Sebagianbash
' s fitur yang sebaliknya dipinjam dariksh
.Lain awk solusi:
Hasil:
sumber
Berikut ini solusi di Perl:
Ia bekerja dengan membaca kolom header ke dalam array dan kemudian, untuk setiap baris data, menyalin nama kolom ke array output jika kolom data yang cocok dievaluasi sebagai benar. Nama kolom kemudian dicetak dengan tanda koma.
sumber
Satu
sed
untuk bersenang-senang:Dengan GNU
sed
, Anda dapat membuatnya sedikit lebih terbaca dengan:Versi yang sedikit lebih pendek, dengan asumsi selalu ada jumlah digit yang sama di setiap baris:
Sama seperti di atas kecuali kami mengganti bagian yang diterjemahkan dan indeks yang memungkinkan untuk beberapa optimasi.
sumber
python3
sumber
Solusi bash murni:
sumber
LESS="+/^ {3}Array" man bash
harus memberikan semua informasi yang diperlukan untuk array bash. Anda bebas mengedit jawaban untuk menambahkan klarifikasi yang membantu.sumber