1

我是 bash shell 脚本的新手,如果能提供可以执行此任务的脚本的建议,我将不胜感激。我有一个包含很多行的文件(list.cqt)。每行都有一个以“/”分隔的字段列表,格式如下:/Field1/Field2/Field3/Field4/Field5/Field6/Field7/Field8/Field9/Field10

例如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 中读取每一行来执行以下命令:
command arg1 arg2 arg3 arg4 *arg5* arg6 arg7 arg8 arg9 arg10

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

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

谢谢!

4

2 回答 2

3

read您可以通过 Internal Field Separator控制 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
于 2012-07-13T19:14:21.513 回答
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

这使代码更快更清晰。

于 2012-07-13T19:08:06.843 回答