【问题标题】:assign two different variables from same line and loop for every line从同一行分配两个不同的变量并为每一行循环
【发布时间】:2022-02-21 17:44:30
【问题描述】:

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

比如我使用的文件是;

foo.txt
10 20
33 40
65 78

我的命令旨在打印;

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

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

我不是 awk 专家(我正在尽我最大的努力),到目前为止我能做的就是这种融合;

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

但它只给出这个输出;

end= start=

只有一次,没有任何变量。我会很感激任何建议。谢谢。

【问题讨论】:

  • 注意:在 awk 中分配一个变量不会在 shell 中创建/设置该变量(反之亦然)。 awk 和 shell 的变量是完全分开的。
  • 我不能完全理解,我不能在分配了 awk 嵌入式代码的 shell 脚本中使用变量吗?谢谢。
  • 不,你不能。每个进程(无论是运行 bash,还是 awk 或其他)都有自己的私有内存,它可以保存它可能拥有的任何变量。您需要执行一些操作,例如从awk 打印变量,在 bash 中捕获输出并将其分配给 bash 变量。您还需要注意不要在子 shell 中分配 bash 变量,因为子 shell 是与主 shell 不同的进程,所以它有自己的独立变量(请参阅BashFAQ #24) .一个例外是环境变量,它的子进程会获得一个副本

标签: bash loops awk command-line data-manipulation


【解决方案1】:

bash 中,您只需要whilereadprintf

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

【讨论】:

  • 我想问一些关于第一个代码的事情; while read -r start end do printf 'end=%d start=%d\n' "$end" "$start" done
  • read -r start end 从标准输入读取一行并将前两个字段分别分配给变量$start$end(顺序很重要)。为了读取更多列,只需添加更多变量名。将 do 部分更改为您想要访问变量的任何内容。
【解决方案2】:

只需 在 Bash 中

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

【讨论】:

  • 我建议用start end替换end start
【解决方案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

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2021-12-01
    相关资源
    最近更新 更多