我有文件,例如其中的值:
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
重点是列数不是静态的,我应该从该特定行中读取列,直到该行结束为止。
谢谢
答案 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
是变量名。
希望这会有所帮助。