繁体   English   中英

如何减去 bash 脚本中 wc -l 输出的数量?

[英]How to subtract the number of the wc -l output in bash script?

我希望输出过滤掉文件中特定行的数量,所以我计算了我需要和不需要的内容并做减法。 但不知何故,输出并没有改变。

这是我的脚本:

#!/bin/bash

for file in "$1"/*;
do
    cat "$file" | while read line;
do
    countContent1="$(grep '\(<Content>\)' | wc -l)"
    countContent2="$(grep '\(showReview\)' | wc -l)"
    valuableReviews="$(($countContent1-$countContent2))"
    echo "$(b=${file##*/}; echo ${b%.*})" $valuableReviews
done
done | sort -r -n -k 2

请注意, <content>showReview在文件中位于同一行。 输出只是包含<content>的行数,没有减法。

这是文件的一部分:

<Author>lass=
<Content>Empfehlenswert....   showReview(11348491, 'full');  
<Date>Sep 28, 2006
<No. Reader>-1
<No. Helpful>-1
<Overall>4
<Value>-1
<Rooms>4
<Location>-1
<Cleanliness>5
<Check in / front desk>-1
<Service>4
<Business service>-1

如果您取出内部while read循环,这更有意义:

#!/bin/bash

for file in "$1"/*; do
    countContent1=$(grep -c '[<]Content[>]' <"$file")
    countContent2=$(grep -c 'showReview' <"$file")
    valuableReviews=$((countContent1 - countContent2))
    b=${file##*/}; b=${b%.*}
    echo "$b $valuableReviews"
done | sort -r -n -k 2

笔记:

  • 我们将"$file"重定向到grep每个副本,因此 grep 计算文件中的内容而不是stdin 上的内容。
  • 我们已经完全删除了while read循环,并让grep遍历每个文件的各个行,而不是尝试在 bash 中执行此操作。 (因此,我们现在每个文件运行 grep 两次,而不是每个文件的每行两次)。
  • 我们不会不必要地使用命令替换。 $(...)有显着的性能损失(低于运行外部命令,但仍远高于在父进程中执行所有操作)。

这将是快还是只用一个AWK的副本替换整个程序:

#!/bin/awk -f

/[<]Content[>]/ {
  ++allContent
  if ($0 ~ /showReview/) {
    ++valuableReviews
  }
}
FILENAME != fn {
  if(fn) { print(fn, ": ", (allContent - valuableReviews)); }
  allContent = 0; valuableReviews = 0; fn = FILENAME;
}
END {
  print(fn, ": ", (allContent - valuableReviews))
}

...称为./theAwkScript "$1"/*

    :>cat file1.txt
    <Author>lass=
    <Content>Empfehlenswert....   showReview(11348491, 'full');
    <Date>Sep 28, 2006
    <No. Reader>-1
    <No. Helpful>-1
    <Overall>4
    <Value>-1
    <Rooms>4
    <Location>-1
    <Cleanliness>5
    <Check in / front desk>-1
    <Service>4
    <Business service>-1

    :>echo -e  "Lines with content $(grep -c Content file1.txt)\nLines with showReview $(grep -c showReview file1.txt)"
    Lines with content 1
    Lines with showReview 1
    :>
grep -c Content file1.txt -- Count of lines matching pattern 
$() --> Run some command 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM