Apakah ada cara untuk mendapatkan integer yang wc dikembalikan dalam bash?
Pada dasarnya saya ingin menulis nomor baris dan jumlah kata ke layar setelah nama file.
output: filename linecount wordcount
Inilah yang saya miliki sejauh ini:
files=`ls`
for f in $files;
do
if [ ! -d $f ] #only print out information about files !directories
then
# some way of getting the wc integers into shell variables and then printing them
echo "$f $lines $ words"
fi
done
cut
mengerjakan hasil penuhwc $f
karena jumlah spasi antar bidang bervariasi.Jawaban paling sederhana yang pernah ada:
sumber
wc -c < file name
, itu hanya akan memberi Anda bilangan bulat byte dan tidak ada yang lain.Hanya:
akan melakukan pekerjaan itu. Tapi keluaran ini menyertakan spasi kosong sebagai
wc
angka rata kanan.sumber
wc -l < foo.txt | xargs
ref - stackoverflow.com/a/12973694/149428lines=`wc -l < $f`
menghasilkan variabel "baris" yang nilainya tidak memiliki spasi di depan.find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l
berfungsi dengan baik tetapi mencetak setiap file. Jika saya menggunakanfind . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <
saya mendapatkan kesalahan.parse error near '\n'
Sesuaikan seperlunya untuk tata letak Anda.
Juga lebih baik menggunakan logika positif ("adalah file") daripada negatif ("bukan direktori")
sumber
wc $file | awk '{print $4" "$2" "$1}'
- apostrof di luar{}
.Terkadang output wc dalam format berbeda di platform berbeda. Sebagai contoh:
Di OS X:
Di Centos:
Jadi menggunakan hanya potongan tidak dapat mengambil nomor tersebut. Sebagai gantinya coba tr untuk menghapus karakter spasi:
sumber
Jawaban yang diterima / populer tidak berfungsi di OSX.
Salah satu dari berikut ini harus portabel di bsd dan linux.
ATAU
ATAU
sumber
Jika Anda mengarahkan nama file ke
wc
dalamnya menghilangkan nama file pada output.Pesta:
atau
Alih-alih menggunakan
for
untuk mengulangi keluaranls
, lakukan ini:yang akan berfungsi jika ada nama file yang menyertakan spasi.
Jika Anda tidak dapat menggunakan globbing, Anda harus menyalurkan ke
while read
loop:atau gunakan substitusi proses
sumber
read lines words characters filename <<< $(wc "$f")
Oh, dan jika Anda dulu * dikeraskan dengan spasi, Anda juga ingin mengutip ganda var saat menggunakannya.$f
dalam hal ini), itu tidak perlu. Juga, OP meminta bagaimana untuk mendapatkan hanya integer. Anda benar tentang mengutip variabel, tetapi saya tidak menunjukkan penggunaan variabel, jadi saya menghilangkan penyebutan hal itu. Thefor f in *
Bentuk harus hampir selalu digunakan daripada menggunakan output darils
, seperti yang Anda tahu.ls
itu. Itu akan memberimu penghargaan. partmaps.org/era/unix/award.html#lsread lines words characters _ <<< $(wc "$f")
$_
hanyalah variabel yang berbeda.Jika filenya kecil, Anda dapat menelepon
wc
dua kali, dan menggunakan sesuatu seperti berikut, yang menghindari menyalurkan ke proses tambahan:Itu
$((...))
adalah Ekspansi Aritmatika dari bash. Ini menghapus spasi apa pun dari outputwc
dalam kasus ini.Solusi ini lebih masuk akal jika Anda perlu baik yang linecount atau wordcount tersebut.
sumber
Bagaimana dengan
sed
?sumber
sumber
Coba ini untuk hasil numerik:
nlines = $ (wc -l <$ myfile)
sumber
Coba ini:
Ini membuat jumlah baris, dan jumlah kata (LINE dan WC), dan meningkatkannya dengan nilai yang diekstrak dari wc (menggunakan $ 1 untuk nilai kolom pertama dan $ 2 untuk yang kedua) dan akhirnya mencetak hasilnya.
sumber
Keluaran: baris myfile.txt: 10 kata: 20 byte: 120
sumber
sumber
perl
tetap menggunakannya , sebaiknya lakukan penghitungan kata di Perl juga. Pendekatan yang lebih ekonomis adalah dengan menyalurkan ketr -d '[:space:]'