【问题标题】:How to make cmd run inside loop?如何让 cmd 在循环内运行?
【发布时间】:2020-11-27 07:06:29
【问题描述】:

我做错了吗?

这个循环似乎不起作用。

#!/usr/bin/ksh

num=3
for i in $(seq 1 "$num") 
do
awk 'NR==$i' "$file1" > "$file2"
# Doing some operation
done

我要执行 3 个 awk:

awk 'NR==1' "$file1" > "$file2"
# do some operation
awk 'NR==2' "$file1" > "$file2"
# do some operation
awk 'NR==3' "$file1" > "$file2"
# do some operation

【问题讨论】:

  • 我认为您可能在for 行的末尾缺少;
  • 在像awk 'NR<=3' "$file1" > "$file2 这样的单个 awk 中不使用循环如何做到这一点。
  • 我需要在它们之间做一些事情(NR==1 然后是一些东西,然后是 NR==2 然后是一些东西)
  • 请参阅stackoverflow.com/q/19075671/1745001 以及另外 - 不要为此使用 shell 循环,这是完全没有必要的。

标签: shell unix awk ksh


【解决方案1】:

在 Bourne shell 及其衍生工具(ksh、zsh 等)中,变量不在单引号内展开。

变化:

awk 'NR==$i'

到:

awk "NR==$i"

如果您的 awk 程序比这一行长,请保留单引号并使用 -v 定义一个 awk 变量:

awk -v "i=$i" 'NR == i'

【讨论】:

  • 如果我的实际 awk 是 awk 'NR==$i && $0 ~ /^apple/ {print > "file2"}' file1 那么我需要修改为 awk -v "i=$i " 'NR == i && $0 ~ /^apple/ {print > "file2"}' file1
  • 没错,否则$0会被shell替换
  • @EdMorton 抱歉,如果我的(已删除)评论听起来很激进。这是一个总结——希望你不会觉得它冒犯:sed -n "$n p"awk "NR == $n" 在现实世界中常用来打印第 N 行。只要你把它们保持得那么短,它们就没有错(尽管它们可以被优化)。此外,我的回答以建议 awk -v 结束,这似乎与您自己的建议相匹配,并且由 OP 选择。由于您很少在没有提出更好的更具教育性的答案的情况下投票,所以它在哪里?我希望看到删除“完全不必要”的循环。
  • @EdMorton 好的,所以awk "NR == $n" 是攻击的载体,常用的sed -n "$n p" 对您来说看起来非常安全(您从未听说过 sed 的 w 命令或 GNU sed 的 es///e 然后呢?)。好的,所以您永远不会在已接受答案的问题上发布答案。好的,所以你在没有任何解释的情况下投了反对票,这对张贴者和接受答案的 OP 来说很有教育意义。好的,OP 需要用特制的最小示例来说明他们的问题,但是当他们这样做时,您会抱怨代码没有意义。错过了。
猜你喜欢
  • 1970-01-01
  • 2022-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多