Linux SHELL脚本,读取每一行以获取不同的列数

时间:2018-11-13 07:02:35

标签: linux bash shell sh

我有文件,例如其中的值:

1 value1.1 value1.2
2 value2.1
3 value3.1 value3.2 value3.3

我需要使用shell脚本从中读取值,但是每行中的列数不同!!! 我知道,例如,如果我想阅读第二列,我会这样做(将行号作为输入参数)

$ awk -v key=1 '$1 == key { print $2 }' input.txt
value1.1

但是正如我提到的,每一行的列数是不同的。 如何使阅读动态化?

例如: 如果输入参数为1,则表示我应该从第一行读取列,因此输出应为

value1.1 value1.2

如果输入参数为2,则表示我应该从第二行读取列,因此输出应为

value2.1

如果输入参数为3,则表示我应该从第三行读取列,因此输出应为

value3.1 value3.2 value3.2

重点是列数不是静态的,我应该从该特定行中读取列,直到该行结束为止。

谢谢

1 个答案:

答案 0 :(得分:3)

然后您可以简单地说:

awk -v key=1 'NR==key' input.txt

已更新

如果要处理列数据,将有几种方法。
使用awk,您可以说以下内容:

awk -v key=3 'NR==key {
    for (i=1; i<=NF; i++)
        printf "column %d = %s\n", i, $i
}' input.txt

输出:

column 1 = value3.1
column 2 = value3.2
column 3 = value3.2

在awk中,您可以直接通过$1$2$3 或通过$i 间接访问每个列值其中变量i包含1、2、3中的一个。

如果您更喜欢使用bash,请尝试以下操作:

line=$(awk -v key=3 'NR==key' input.txt)
set -- $line    # split into columns

for ((i=1; i<=$#; i++)); do
    echo column $i = ${!i}
done

输出相同的结果。
在bash中,间接访问有点复杂,您需要说出${!i},其中i是变量名。

希望这会有所帮助。