如何使用AWK编写包含给定单词并且在一行中至少包含给定数量字符的文件的每一行?

时间:2017-04-24 12:48:28

标签: bash shell awk

假设我有两个文本文件(sample1.txt,sample2.txt)和一个包含AWK的shell脚本文件(myscript.sh)。
sample1.txt:

 Nunc ipsum ultricies aliquet nisl eu hendrerit.
 Nunc ipsum

sample2.txt

Lorem ipsum dolor sit amet

如果我输入控制台:./ myscript ipsum 5 sample1.txt sample2.txt我想看:
Lorem ipsum Nunc ipsum ultricies aliquet nisl eu hendrerit.
Nunc ipsum
#!/bin/bash if [ $# -lt 3 ]; then echo Usage: word number files exit 1 fi re2='^[0-9]+$' if ! [[ $2 =~ $re2 ]] ; then echo "$2 is not a number" exit 1 fi word=$1 lines=$2 shift shift for i do if [ ! -f $i ]; then echo "$i is not a file!" exit 1 fi awk -var=$lines 'BEGIN{}; (length($0)>var){'/$word'/} END{} ' $* done

myscript.sh

 If counter = 1500 And require.Value <> require.Offset(-1).Value Then

不幸的是,这没有任何输出!

2 个答案:

答案 0 :(得分:2)

我认为这是你正在尝试做的事情

lines=5; word=ipsum; 

值设置

awk -v lines="$lines" -v word="$word" 'length($0)>lines && $0~word' files

对于给定的文件,将产生

Lorem ipsum dolor sit amet
Lorem ipsum
 Nunc ipsum ultricies aliquet nisl eu hendrerit.
 Nunc ipsum

请注意,在您的脚本中,定义的变量为ar,而不是var。您有空BEGINEND块。另外bash不能用单引号($ word)替换变量值。即使如此匹配/variable/也不会起作用,因为variable被视为字面意思。正确匹配的方法是使用~运算符,就像在我的脚本中一样。

根据下面的评论,如果你正在寻找一个确切的单词匹配,也许更容易进行相等检查(替代方法是使用单词边界)

$ ... 'length($0)>var{for(i=1;i<=NF;i++) if($i==word) {print; next}}' file

现在ipsumthingswrong将不匹配。

答案 1 :(得分:1)

可能是你想做这样的事情:

$ awk -v search="ipsum" 'length($0) != length(search) && $0 ~ search{print}' file1 file2
Lorem ipsum dolor sit amet
Lorem ipsum
Nunc ipsum ultricies aliquet nisl eu hendrerit.
Nunc ipsum