我有一个文件和行作为一些命令的输出,如下例所示:
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 将下一行标记为命令参数。$line
echo
LABEL
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 扩展。