簡體   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