2014-09-12 79 views
0

我需要编写一个bash脚本,它将从包含文件列表的命令行输入(文件)。然后,我需要在文件内部打开这些文件并逐字读取它,并记录列表中所有文件中每个单词的出现次数。到目前为止,它正在打印出文件内的文件列表,还有文件本身。这是我迄今为止所拥有的。我是新来的bash脚本,所以我不知道如何做到这一点。我感谢任何帮助。谢谢Bash脚本从文件列表中读取命令行中的文件

#!/bin/bash 

    wordArray=() 
    countArray=() 
    INPUT="$1"; 

    if [ -f "$INPUT" ] 
    then 
     find $name -type f 
     echo "$name"; 
    else 
     echo "$INPUT is not a file!"; 
    fi 
+1

我不明白这到底是怎么可能做你说什么它。你在哪里设置'$ name'? – Barmar 2014-09-12 20:17:08

+0

为什么如果你在文件中有文件名,你需要'find'? – jm666 2014-09-12 20:26:16

回答

2

要计算在列表中的所有文件中的所有单词的出现次数在一个文件中,你可以使用:

xargs grep -hoP '\b\w+\b' < file_with_list | sort | uniq -c 

例子:

文件列表。 txt

test1.txt 
test2.txt 

test1.txt的

hello world 

的test2.txt

hello word hello again 

运行:

xargs grep -hoP '\b\w+\b' < list.txt | sort | uniq -c 

打印

1 again 
    3 hello 
    2 word 

注意事项:

  • list.txt其文件名不能包含空格...
+0

工作。谢谢!如果我想按出现次数排序......我需要更改哪些内容? – 2014-09-13 01:12:55

+0

此外,它只需要打印输出文件中的有效单词...我知道如何检查一个有效的单词,但不在您编写的代码中。 – 2014-09-13 01:20:32

+0

聪明的解决方案 – ShaneQful 2014-09-13 16:14:25

-1

我认为你正在寻找这样的东西,而不是找到。

for name in $INPUT; do echo $name; done 

这将打印$ INPUT文件中的所有文件,当然您可以在该循环中执行其他任何操作。

+2

请测试您的脚本 - 这将只打印变量'$ INPUT'的内容而不是文件的内容,名称存储在INPUT ... – jm666 2014-09-12 20:35:44

+0

是的,这比使用find更好。谢谢。但是,我怎样才能打开列表中的这些文件,将每个单词读入一个数组,以保持每个单词的出现次数? – 2014-09-12 20:39:11

+0

做猫$的名字,而不是做echo $ name – vlp 2014-09-12 20:40:25

0

尝试:

#!/bin/bash 

err() { echo "[email protected]" >&2; return 1; } 

printwords() { 
    echo "Wordcounts in the: [email protected]" 
    for i in "${!words[@]}" 
    do 
     echo "$i => ${words[$i]}" 
    done 
} 

input="$1" 
[[ -n $input ]] || err "Usage: $0 filename" || exit 1 
[[ -f $input ]] || err "File $input doesn't exists" || exit 2 

declare -A words 
while read -r file 
do 
    while read -r word 
    do 
     let words[$word]++ 
    done < <(grep -oP '\b\w+\b' "$file") 
done < "$input" 

printwords "$(cat "$input" | xargs)" 
+0

它不承认-A和正在打印:grep :::没有这样的文件或目录 – 2014-09-12 21:58:59