打印和处理交替行

打印和处理交替行

我有一个文件和行作为一些命令的输出,如下例所示:

kk 
25
bb
34
cc
56
dd
67

我想要这样的 bash 输出

echo "kk" #(line 1)

在 25 #(第 2 行) 上执行一些命令

echo "bb"  #(line 3)

在 34 #(第 4 行) 上执行一些命令,依此类推...

答案1

假设总是相同的命令(我们称其为my_cmd)您想要对文件中偶数行的内容执行(我们称其为previous_output.txt),以下脚本应该可以工作:

#!/bin/bash

LABEL=1

while read line
do
  if (( LABEL == 1 ))
  then
    echo "$line"
    LABEL=0
  else
    my_cmd "$line"
    LABEL=1
  fi
done < previous_output.txt

解释:

  • 第一行是确保使用 bash 对其进行解释。
  • 然后我们定义一个变量 LABEL,对于那些您只想“回显”的行,它的值为 1。
  • 接下来,我们循环遍历文件中包含“某些命令的输出”的所有行,并将它们逐行读入变量line
  • if我们的变量LABEL是,我们只需输出using1的内容,并通过设置为 0 将下一行标记为命令参数。$lineechoLABEL
  • else我们运行my_cmd的内容,并通过设置为 1$line再次将下一行标记为标签。LABEL
  • 后面的最后一条语句done指示 bash 从指定的文件中获取输入。

为了了解有关 shell 编程的更多信息,我建议您参考高级 Bash 脚本编写指南

答案2

如果我理解正确的话:

sed -Ee '1~2s/^(.*)/echo \1/' -Ee 's/^([0-9]{2})/command \1/' file

输出:

echo kk 
command 25
echo bb
command 34
echo cc
command 56
echo dd
command 67

答案3

假设您希望将奇数行简单地复制到输出,而对于偶数行由命令处理并打印结果,我们可以使用一个简单的(单行)GNU sed 程序:

#!/bin/sed -f

0~2s!.*!dc -e '& 2*p'!e

在这里,我将“命令”设置为简单的数字加倍,但您可以在那里做任何您想做的事情。

这是给我的输出:

kk 
50
bb
68
cc
112
dd
134

请注意,“step”寻址和/e“execute”标志s都是标准 sed 中未提供的 GNU 扩展。

相关内容