从同一行分配两个不同的变量,并为每行循环 [duplicate]

assign two different variables from same line and loop for every line [duplicate]

提问人:juylmin 提问时间:2/15/2022 最后编辑:juylmin 更新时间:2/21/2022 访问量:1555

问:

我正在尝试从 2 列 txt 文件中分配 awk 获取的变量。 到命令,该命令将每两个值作为两个变量包含在其中。

例如,我使用的文件是;

foo.txt
10 20
33 40
65 78

我的命令旨在打印;

end=20 start=10
end=40 start=33
end=78 start=65

基本上,我想迭代每一行的代码,对于输出,输入文件的两列中将有两个变量。

我不是一个笨拙的专家(我正在尽力而为),到目前为止我能做的就是这种融合;

while read -r line ; do  awk '{ second_variable=$2 ; first_variable=$1 ; }'  ; echo "end=$first_name start=$second_name"; done <foo.txt

但它只给出这个输出;

end= start=

只有一次,没有任何变量。我将不胜感激任何建议。谢谢。

bash 循环 awk 命令行 数据操作

评论

1赞 Gordon Davisson 2/15/2022
注意:在 shell 中分配变量不会在 shell 中创建/设置该变量(反之亦然)。awk 和 shell 的变量是完全分开的。awk
0赞 juylmin 2/15/2022
我无法完全理解,我不能在我分配了 awk 嵌入式代码的 shell 脚本中使用变量吗?谢谢。
0赞 Gordon Davisson 2/15/2022
不可以。每个进程(无论是运行 bash 还是 ,或者其他什么)都有自己的私有内存,它保存它可能拥有的任何变量。您需要执行一些操作,例如从 中打印变量,在 bash 中捕获输出并将其分配给 bash 变量。您还需要注意不要在子 shell 中分配 bash 变量,因为子 shell 是独立于主 shell 的进程,因此它也有自己的单独变量(参见 BashFAQ #24)。一个例外是环境变量,子进程会获取其副本awkawk

答:

0赞 KamilCuk 2/15/2022 #1

就在 Bash 中

while read -r end start; do echo "end=$end start=$start"; done <foo.txt

评论

3赞 Cyrus 2/15/2022
我建议用 .end startstart end
3赞 pmf 2/15/2022 #2

在你只需要 和 :bashwhilereadprintf

while read -r start end
do printf 'end=%d start=%d\n' "$end" "$start"
done < foo.txt
end=20 start=10
end=40 start=33
end=78 start=65

使用 ,您可以执行以下操作:awk

awk '{print "end=" $2, "start=" $1}' foo.txt
end=20 start=10
end=40 start=33
end=78 start=65

使用正则表达式:sed

sed -E 's/([0-9]+) ([0-9]+)/end=\2 start=\1/' foo.txt
end=20 start=10
end=40 start=33
end=78 start=65

评论

0赞 juylmin 2/15/2022
我想问一些关于第一个代码的问题;当读取 -r 开始结束时,请 printf 'end=%d start=%d\n' “$end” “$start” < foo 完成.txt 究竟是哪个部分在分配变量?如果我想做别的事情,而不仅仅是打印它们,我需要两者。谢谢。
0赞 pmf 2/15/2022
read -r start end从 stdin 中读取一行,并将前两个字段分别分配给变量 和 (顺序很重要)。为了读取更多列,只需添加更多变量名称即可。将部件更改为要访问变量的任何操作。$start$enddo
0赞 Weihang Jian 2/21/2022 #3

使用呢?xargs

xargs -n2 sh -c 'echo end=$1 start=$2' sh < file.txt

演示

xargs -n2 sh -c 'echo end=$1 start=$2' sh <<INPUT
10 20
33 40
65 78
INPUT

输出

end=10 start=20
end=33 start=40
end=65 start=78