由 awk 在 bash 中创建的索引变量

Posted

技术标签:

【中文标题】由 awk 在 bash 中创建的索引变量【英文标题】:Indexing variable created by awk in bash 【发布时间】:2016-01-30 01:29:53 【问题描述】:

我在使用 awk 索引从文本文件派生的变量(由 1 行和 4 个值组成)时遇到了一些问题。

特别是,我有一个包含循环所有输入信息的文本文件。每行包含 4 个特定的输入值,每次迭代都使用输入文件的不同行。

输入文件如下所示:

/home/hannelore/TVB-pipe_local/subjects/CON02T1/ 10012 100000 1001 --> used for iteration 1
/home/hannelore/TVB-pipe_local/subjects/CON02T1/ 10013 7200 1001 --> used for iteration 2
...

从这个输入文本文件中,我确定了不同的列(路径、种子、计数、目标),然后我想在循环的每次迭代中索引这些变量。但是,索引 0 返回整个变量,更高的索引返回没有输出。在这个获得的变量上使用 awk、cut 或 IFS,我无法拆分该变量。谁能帮我解决这个问题?

我使用的一些代码:

seed=$(awk 'print $2' $input_file) 

--> 从输入文件中提取列信息,这可行

seedsplit=$(awk 'print $2' $seed)

seedsplit=$(cut -f2 -d ' ' $seed)"

提前谢谢你!

亲切的问候,

汉内洛尔

【问题讨论】:

我不明白你在 seedsplit 作业中做了什么。 awk 的第二个参数是文件名,但 $seed 包含输入文件字段 2 中的所有值。 信息不足。这些路径位置有哪些文件?它们包含什么,你想从中提取什么? 您要索引什么变量?我在您的代码中没有看到任何数组。 也许你想做的是将seed 设为一个数组:seed=($(awk 'print $2' $input_file))。然后就可以使用$seed[0]$seed[1]等索引了。 谢谢,Barmar,使用额外的一对括号使它像我想要的那样工作。 【参考方案1】:

如果我理解正确,您想逐行从输入文件中提取值。

while read a b c d; do echo "var1:" $a; done < file

将打印

var1: /home/hannelore/TVB-pipe_local/subjects/CON02T1/
var1: /home/hannelore/TVB-pipe_local/subjects/CON02T1/

类似地,您可以访问 b、c 和 d 中的其他变量。

【讨论】:

【参考方案2】:

如果你想要一个数组,那么使用数组赋值表示法:

seed=( $(awk 'print $2' $input_file) )

现在您将在一个单独的数组元素中拥有来自awk 的每一行输出中的单词。

col1=( $(awk 'print $1' $input_file) )
col3=( $(awk 'print $3' $input_file) )

现在您有了三个可以并行索引的数组。

for i in $(seq 1 "$#col1[@]"
do
    echo "$col1[$i] in col1; $seed[$i] in col2; $col3[$i] in col3"
done

【讨论】:

以上是关于由 awk 在 bash 中创建的索引变量的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历列表并在 bash / awk 中作为变量传递

当数组在对象变量中时访问单个数组索引

有啥方法可以返回对函数中创建的变量的引用?

怎么给bash shell当中的变量获取awk行处理后得到的值

Xcode Swift 调试器不会显示在 if 语句中创建的变量

将一个函数中创建的 PHP 变量传递给另一个函数