UNIX_shell_programming(几道练习题目)

本文介绍了一个用于计算多个文件中单词出现频率的Shell脚本。该脚本能够处理命令行参数传入的文件,并统计每个文件内单词的出现次数,最后以表格形式展示结果。单词被定义为一个或多个连续的字母字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Word Frequency

Given n files as command line arguments, calculate the frequency of words for each file, and display the results in a table. Words are defined to be one or more continuous list of letters (see the definition of letters above). Every non-letter character is to be considered whitespace.

The output should be a multi-column list, the first column being the list of words encountered (in lowercase) in any of the input files (sorted according to the C locale), and subsequent columns containing the number of occurrences of that word in file1 ... filen, separated by spaces. Example output for 2 files:

a 5 8
the 6 3
word 2 0
she 3 5
#!/bin/bash

# Word frequencies
# $Id: unix9-wordfreq.sh 191 2006-03-29 11:07:00Z cactus $
# See http://cactus.rulez.org/elte/2005-1-unix/#9 for a description of what it does
# Licensed under the GNU General Public License, version 2

function help () {
    self=`basename $0`

    cat << EOF
Usage: $self FILE1 [FILE2...]
Creates statistics about the words occuring in the files.

Options:
    -help   Display this help message

(C) 2005 Dr. ERDI Gergo <cactus@cactus.rulez.org>

Version: \$Id: unix9-wordfreq.sh 191 2006-03-29 11:07:00Z cactus $
EOF
    exit 0
}

function error () {
    echo ERROR: $@! >&2
    exit 1
}

# Ez mashogy mukodik mint a tobbi: itt csak vegignezzuk az opciokat,
# hogy van-e koztuk -help

function options () {
    [ -z "$1" ] && return
    case "$1" in
	-help)
	    help
	    ;;
	*)
	    [ -f "$1" -a -r "$1" ] || error "$1: Unable to open file"
	    shift
	    options "$@"
	    ;;
    esac
}

function awk_count () {
    AWKPROG='
BEGIN {
    FS="[^a-zA-ZáÁéÉíÍóÓöÖõÕúÚüÜûÛ]"
    
    ekezet_lower["Á"] = "á";
    ekezet_lower["É"] = "é";
    ekezet_lower["Í"] = "í";
    ekezet_lower["Ó"] = "ó";
    ekezet_lower["Ö"] = "ö";
    ekezet_lower["Õ"] = "õ";
    ekezet_lower["Ú"] = "ú";
    ekezet_lower["Ü"] = "ü";
    ekezet_lower["Û"] = "û";
}

function iso88592_tolower (s) {
    ret=""

    for (j = 1; j <= length(s); j++)
        ret = ret iso88592_tolower_c(substr(s, j, 1));
    return ret;
}

function iso88592_tolower_c (c) {
    if (match (c, "[a-zA-Z]"))
        return tolower (c);
    else if (c in ekezet_lower)
        return ekezet_lower[c];

    return c;
}
    

/[a-zA-ZáÁéÉíÍóÓöÖõÕúÚüÜûÛ]/ {
    for (i = 1; i != NF + 1; i++)
    {
        if (match ($i, "^[a-zA-ZáÁéÉíÍóÓöÖõÕúÚüÜûÛ]+$"))
	{
            words[iso88592_tolower($i)]++;
	}
    }
}

END {    
    for (i in words)
        printf "%s %s\n", i, words[i];
}
'
    echo "awk '$AWKPROG' '$1' 2>/dev/null|sort"
}

# Ez elemenkenti feldolgozas, oriasi Fothi power :)
function awk_join () {
    AWKPROG='
function read1 () {
    if (!eof1) {
        eof1 = (getline <= 0);
        if (eof1)
            return;
        
        key1 = $1;
        val1 = $2;

        width = NF - 1;
        for (i = 3; i <= NF; ++i)
            val1 = sprintf ("%s %s", val1, $i);
    }
}

function read2 () {
    if (!eof2) {
        eof2 = ((getline < f2) <= 0);
        if (eof2)
            return;
        
        key2 = $1;
        val2 = $2;
    }
}

function join () {
    printf "%s %s %s\n", key1, val1, val2;
}

function fill_from_1 () {
    printf "%s %s 0\n", key1, val1, "0";
}

function fill_from_2 () {
    printf "%s ", key2;
    for (i = 0; i < width; ++i)
        printf "0 ";
    printf "%s\n", val2;
}

BEGIN {
    FS=" ";

    read1();
    read2();
    
    while (!eof1 || !eof2) {
        if (key1 == key2) {
            join();
            read1();
            read2();
        } else if (eof2 || (!eof1 && (key1 < key2))) {
            fill_from_1();
            read1();
        } else {
            fill_from_2();
            read2();
        }
    }
    exit
}
'
    echo "awk -v f2=<($1) '$AWKPROG' 2>/dev/null"
}


[ $# -lt 1 ] && error "Missing arguments"
options "$@"

fullpipe="$(awk_count $1)"
shift

for i in "$@"
do
  counter="`awk_count $i`"  
  awkline="`awk_join "$counter"`"  
  fullpipe="$fullpipe | $awkline"
done

export LANG=
export LC_ALL=
export LC_CTYPE=
eval "$fullpipe"
转载自:http://gergo.erdi.hu/elte/2005-1-unix/
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值