bash shell脚本,用于读取文件中的字段并生成命令

时间:2012-07-13 19:04:08

标签: bash shell

我是bash shell脚本的新手,非常感谢能够执行此任务的脚本的建议。我有一个包含许多行的文件(list.cqt)。每行都有一个以“/”分隔的字段列表,格式如下: /字段1 /字段2 /字段3 /字段4 /字段5 /字段6 /字段7 /字段8 /字段9 /字段10

例如list.cqt中的内容是:
/ F11 / F12 / F13 / F14 / F15 / F16 / F17 / F18 / F19 / F110
/ F21 / F22 / F23 / F24 / F25 / F26 / F27 / F28 / F29 / F210
...
/ Fx1 / Fx2 / Fx3 / Fx4 / Fx5 / Fx6 / Fx7 / Fx8 / Fx9 / Fx10

(我修改了每个字段中的名称只是为了简化问题。每行中只有字段数是常量。每个字段中的内容可以是任何东西 - 数字,字符等)

我需要编写一个脚本来通过读取list.cqt中的每一行来执行以下命令:
命令arg1 arg2 arg3 arg4 * arg5 * arg6 arg7 arg8 arg9 arg10

每行只读取 arg4 arg5 arg7 arg10 。休息都保持不变。
arg4 是list.cqt中该行的Field4 arg5 是list.cqt中该行的Field6 对于第一个命令, arg7 基本上以-1000开始,并以100为增量进行更改。因此对于第二个命令,第二个命令将为-900,依此类推,第11个命令为0,第12个命令为100命令,第13命令200等 arg10 arg7 的绝对值相同,但符号相反。因此,如果 arg7 为-600,则 arg10 为600.如果 arg7 为400,则 arg10 为-400。

例如,在上面的文件示例中从list.cqt读取前两行,命令为:
命令arg1 arg2 arg3 F14 F16 arg6 -1000 arg8 arg9 1000
命令arg1 arg2 arg3 F24 F26 arg6 -900 arg8 arg9 900

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以通过内部字段分隔符read控制shell的IFS命令的分隔符。如果您读入数组,则可以轻松访问索引值。然后,循环输入和更新计数器变量变得很简单。如果将参数保存到数组中,则只需将展开的数组作为参数传递给命令。

#!/bin/bash

# Use set -x to see if the array "args" is getting assigned the values you expect.
IFS='/'
counter=-1000
while read -a fields; do
    (( counter+=100 ))
    args=(
        'arg1' 'arg2' 'arg3'
        "${fields[4]}" "${fields[6]}" 'arg6'
        $counter 'arg8' 'arg9' $(( -1 * counter ))
    )
    # command "${args[@]}"
done < list.cqt

答案 1 :(得分:2)

我在命令之前添加了echo,因为最好检查生成的列表是否正确:

arg7=-1000
arg10=1000
while read line
do
  set $(echo $line | tr / ' ')
  echo command arg1 arg2 arg3 "$4" "$6" arg6 "$arg7" arg8 arg9 "$arg10"
  arg10=$((arg10-100))
  arg7=$((arg7+100))
done < list.cqt

如果是,只需删除echo并运行脚本。

这里你逐行处理list.cqt并将其部分行设置为shell的位置参数;然后将此部分用作$4$6。每次处理arg10文件中的行时,变量arg7list.cqt都会增加/减少。

<强>更新

您也可以使用数组而不是位置参数(感谢Dennis Williamson和kojiro的提示):

arg7=-1000
arg10=1000
while IFS=/ read line
do
  echo command arg1 arg2 arg3 "${line[4]}" "${line[6]}" arg6 "$arg7" arg8 arg9 "$arg10"
  arg10=$((arg10-100))
  arg7=$((arg7+100))
done < list.cqt

这使代码更快更清洁。