使用bash在文本文件中每隔四行执行一次命令

使用bash在文本文件中每隔四行执行一次命令,bash,Bash,我正在尝试在第2、6、10、14行执行grep命令。。。一个文件,但这不太管用。似乎我的if语句有错误。有什么想法吗 count=0 while read p; do if [$count%4==2] then grep $p /dir/file.txt | wc -l >> output.txt (( count++ )) fi done < /dir/file.txt 最后,我想让这个脚本在output.txt

我正在尝试在第2、6、10、14行执行grep命令。。。一个文件,但这不太管用。似乎我的if语句有错误。有什么想法吗

count=0

while read p; do
    if [$count%4==2]
    then
        grep $p /dir/file.txt | wc -l >> output.txt
        (( count++ ))
    fi  
done < /dir/file.txt

最后,我想让这个脚本在output.txt中列出第2行在文件中重复了多少次,第6行重复了多少次,第10行和第14行等等。

首先grep在文件中工作。如果要在特定行中对图案进行grep,则可以执行以下操作:

i=1; 
while read -r line;  
do 
   if [ $((i++ % 2)) -eq 0 ]; then
      echo "$line" | grep $p >> output.txt
   fi
done </dir/file.txt

首先,grep在文件上工作。如果要在特定行中对图案进行grep,则可以执行以下操作:

i=1; 
while read -r line;  
do 
   if [ $((i++ % 2)) -eq 0 ]; then
      echo "$line" | grep $p >> output.txt
   fi
done </dir/file.txt

这听起来像是awk的工具,您可以访问变量NR,它是当前正在处理的行的编号,因此,例如,seq 14输出1到14之间的数字,每行一个:

$ seq 14 | awk '(NR+2) % 4==0'
2
6
10
14

这听起来像是awk的工具,您可以访问变量NR,它是当前正在处理的行的编号,因此,例如,seq 14输出1到14之间的数字,每行一个:

$ seq 14 | awk '(NR+2) % 4==0'
2
6
10
14

你的shell语法是hosed;您需要方括号内的空格;但模运算符不是[内置]的功能,因此需要进行一些不吸引人的更改来修复它

无论如何,使用Awk可以大大简化这一过程

awk -v pat="$p" '(NR % 4) == 2 && $0 ~ pat { ++count }
    END { print count }' /dir/file.txt

NR是当前行号,$0是当前输入行。pat是作为shell变量$p的变量传入的模式。

您的shell语法是hosed;您需要方括号内的空格;但模运算符不是[内置,因此您需要进行一些不吸引人的更改来修复它

无论如何,使用Awk可以大大简化这一过程

awk -v pat="$p" '(NR % 4) == 2 && $0 ~ pat { ++count }
    END { print count }' /dir/file.txt

NR是当前行号,$0是当前输入行。pat是作为shell变量$p的变量传入的模式。

Sed有跳行。使用该选项仅获取要测试的行,然后将结果变为灰色

$ sed -e "2,~4p" -e d <infile |grep $p

Sed有跳行。使用它只获取要测试的行,然后grep结果

$ sed -e "2,~4p" -e d <infile |grep $p

如果[$count%4==2]使用if count%4==2,则应在fi之后和完成之前添加一个count。否则,当$count%4==2时,count只会添加1。文件中的每一行的count都应该增加,而不仅仅是当%4==2时。而不是如果[$count%4==2]如果count%4==2,则应在fi之后和完成之前添加一个count。否则,当$count%4==2时,count只会添加1。不仅当%4==2时,文件中的每一行的count都应该增加。因此,我认为这看起来不错,但我做了一个修改,在最后一行末尾添加了'output.txt',脚本会输出一个计数,并且然后似乎永远不会结束。如果要重定向到output.txt,则需要添加>output.txt,而不仅仅是文件名。很抱歉,我键入了错误。我确实添加了该文件。我实际上在末尾有>>output.txt。我假设您真的需要一个聚合计数。如果要为每个匹配行输出文字1,请打印1而不是++计数nd丢失了整个结束块。所以我认为这看起来不错,但我做了一个修改,在最后一行的末尾添加了“output.txt”,一个脚本输出一个计数,然后似乎永远不会结束。如果你想重定向到output.txt,你需要添加>output.txt,而不仅仅是文件名。很抱歉,我打错了。我确实添加了。我实际上,在末尾有>>output.txt。我假设您确实想要一个聚合计数。如果您想要为每个匹配的行输出一个文本1,那么打印1而不是++计数,并丢失整个结束块…并添加| grep$p以仅提取匹配的行;使用grep-c以反模式获取wc-l的计数管道…并添加| grep$p仅提取匹配的行;使用grep-c在反模式中获取到wc-l的计数管道。