【问题标题】:Count 3 types of delimiters (comma, semicolon, pipe) from different files计算来自不同文件的 3 种分隔符(逗号、分号、管道)
【发布时间】:2019-07-23 08:27:44
【问题描述】:

我正在尝试开发类似的东西。但我的要求有点不同。我想计算第一行和第二行的分隔符数量。如果两行的分隔符匹配,则很好,否则需要将文件移动到拒绝文件夹。下面是脚本。但是在这里我有一个问题,我如何计算不同文件中的 3 个不同的分隔符。例如,我有逗号、分号和管道分隔符。在下面的 sed 命令脚本中,如何同时检查 3 种类型的分隔符?

pathname=/opt/interfaces/sample_check/mvfiles/inbox

findresult=$(find $pathname -type f ( -name "messagemulti.csv" -or -name "messagesemi.txt" -or -name "comma2.txt" -or -name "messagepipe.txt" -or -name "tokkalodi.txt" -or -name "ADMC_POSITION-LT3213.csv" -or -name "DMC_CASHFLOW248.csv" -or -name "ADMC_EQBASKET-WEIGHTS_52387.csv" -or -name "ADMC_POSITION-DDD7.csv" -or -name "ADMC_POSITION-DDD7.csv" ))

Count=sed -n 1p $findresult | tr ',' '\n' | wc -l
Count2=sed -n 2p $findresult | tr ',' '\n' | wc -l

echo $Count echo $Count2

if [ $Count != $Count2 ]
then echo "Mis Match"
  mv $findresult /opt/interfaces/sample_check/mvfiles/reject
else echo "Match"
  exit
fi

【问题讨论】:

  • 我已尝试重新格式化您的代码,使其看起来像代码。请检查我没有改变意思。
  • 谢谢 Dave,我是 stackoverflow 的新手
  • 没问题。如果您打算闲逛,那么值得自学Markdown 的工作原理。
  • 刚才我学会了通过给 4 倍空间来做到这一点:) 谢谢戴夫

标签: linux shell perl unix sed


【解决方案1】:

关于 bash shell 类型

i=
pathname=/opt/interfaces/sample_check/mvfiles/inbox
for file in messagemulti.csv messagesemi.txt comma2.txt messagepipe.txt tokkalodi.txt ADMC_POSITION-LT3213.csv DMC_CASHFLOW248.csv ADMC_EQBASKET-WEIGHTS_52387.csv ADMC_POSITION-DDD7.csv ADMC_POSITION-DDD7.csv
{
while read -r l ;do s=${l//[!,;\|]}; c=${#s}; ((++i==1))&&d=$c; if((i==2));then ((d==c)) ||mv -v $file $pathname/$file ;fi ;done<$file
}

【讨论】:

    【解决方案2】:

    您可以通过将分隔符移动到新行来计算分隔符,用“;”替换,然后计算它们:

    sed '2 s/[|,;]/\n;/g' ${findresult} | grep -c ';'
    

    当您只想知道哪些具有相同的数字时,您无需计算它们。
    删除所有其他字符并用点替换任何剩余的字符。

    if [[ $(sed '1s/[^|,;]//g;s/././g' ${findresult}) != 
          $(sed '2s/[^|,;]//g;s/././g' ${findresult}) ]]; then
    

    【讨论】:

      【解决方案3】:

      如果没有分隔符是前两行的其他部分,您可以使用这个通用的 GNU awk 脚本:

      parse.awk

      BEGIN  { FS="[,;|]" }            # Set Field Separators
      FNR==1 { count = NF }            # Remember Number of Fields from the first line
      FNR==2 { 
        if(count != NF)                # If second line has the same number of fields
          print "Mismatch: " FILENAME  # Report the mismatched file
        nextfile                       # Skip to next input file
      }
      

      像这样运行它:

      awk -f parse.awk infile1 infile2 ...
      

      这将输出计数不匹配的所有文件。

      【讨论】:

      • 您好,托尔,谢谢。你能解释一下你的代码吗?我不明白下一个文件是做什么的。
      • @KiranChapidi:见内联 cmets
      • 我有多个文件大约50个文件,随机到达系统。这些文件可能包含三个分隔符(逗号、分号或管道)中的任何一个。如果文件分隔符计数中的第一行与第二行中的分隔符计数不匹配,则需要将文件移动到拒绝文件夹。
      • @KiranChapidi:将脚本集成到您的流程中,例如:find ... -exec awk -f parse.awk {} + | xargs mv -t /path/to/reject。请注意,您需要从 print 语句中删除 "Mismatch: "
      【解决方案4】:

      我在下面找到了同时包含所有分隔符的内容。请检查是否正确。

      pathname=/opt/interfaces/sample_check/mvfiles/inbox
      
      findresult=$(find $pathname -type f ( -name "messagemulti.csv" -or -name "messagesemi.txt" -or -name "comma2.txt" -or -name "messagepipe.txt" -or -name "tokkalodi.txt" -or -name "ADMC_POSITION-LT3213.csv" -or -name "DMC_CASHFLOW248.csv" -or -name "ADMC_EQBASKET-WEIGHTS_52387.csv" -or -name "ADMC_POSITION-DDD7.csv" -or -name "ADMC_POSITION-DDD7.csv" ))
      
      Count=sed -n 1p $findresult | tr '[,;|]' '\n' | wc -l
      Count2=sed -n 2p $findresult | tr '[,;|]' '\n' | wc -l
      
      echo $Count echo $Count2
      
      if [ $Count != $Count2 ]
      then echo "Mis Match"
      mv $findresult /opt/interfaces/sample_check/mvfiles/reject
      else echo "Match"
      exit
      fi
      

      【讨论】:

        【解决方案5】:

        我刚刚创建了一个文件,其中只包含逗号、分号和竖线字符:

        echo ",,,;;;;|||||" >test.txt
        

        然后我运行以下命令:

        echo $(($(grep -o "," test.txt | wc -l) + $(grep -o ";" test.txt | wc -l) + $(grep -o "|" test.txt | wc -l)))
        

        结果是 12,正如预期的那样。

        【讨论】:

        • 这会计算整个文件中的分隔符,而不仅仅是前两行
        • cat test.txt | head -2 | grep -o "," | wc -l,所以你只计算前两行。
        • OP想要比较第一行的计数和第二行的计数。
        猜你喜欢
        • 1970-01-01
        • 2016-09-05
        • 2020-07-21
        • 2021-09-04
        • 1970-01-01
        • 2023-03-05
        • 2019-05-21
        • 2020-02-02
        • 2017-06-24
        相关资源
        最近更新 更多