将命令的输出通过管道传输到 awk 脚本主体中的变量

将命令的输出通过管道传输到 awk 脚本主体中的变量

给定inputfile

Cherries:20:100:300
Beans:12:400:500
Tomatoes:32:445:234
Potatoes:24:400:200
Kiwis:23:230:435

我有一个 awk 脚本,名为testscript.script

BEGIN{ FS = ":" 
print "------------------------"
}

if($3 + $4 > 500) {print $1, $2}
END{
print "------------------------" 
}

调用此脚本时的输出awk -f testscript.script inputfile如下:

------------------------
Beans 12
Tomatoes 32
Potatoes 24
Kiwis 23
------------------------

我想按字母顺序(按名称)对该列表进行排序,然后将其存储到一个变量中,以便可以在端块awk 脚本的。

即代码应该看起来像这样。

BEGIN{ FS = ":" 
print "------------------------"
}

*if($3 + $4 > 500) {print $1, $2 | "sort" = variable}
END{
print "------------------------" 
print variable
}

print variable命令会产生

------------
------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32

将排序后的项目列表作为变量,并将其打印在虚线后面的 END 块中。

做这个的最好方式是什么?

答案1

echo "---------------";awk -F: '$3+$4>500{print $1,$2}' inputfile |sort && echo "---------------"

使用 awk

awk -F: '$3+$4>500{Arr[$1]=$2}END{n=asorti(Arr,SArr);for(i=1;i<=n;i++){print SArr[i],Arr[SArr[i]]}}' inputfile

答案2

在考虑“最佳”方式时,需要考虑很多因素,我认为最佳是满足我的需求的最快路线。如果您试图传递超出进程范围的变量,我建议将其通过管道传输到 ram 驱动器(几乎所有发行版都有一个),然后处理您的测试,并在完成后从该 ramdisk 中导出。

在基于 Debian 的发行版上,您会发现 ram 驱动器位于 /run/shm,因此类似的东西可能会满足您的需求。

cat inputdata.file | sed 's/:/ /g' | awk '{print $1" "$2}' | sort -k 1,1 > /run/shm/datastore.file; echo '------------------------' > datastore2.file; cat /run/shm/datastore.file>>/run/shm/datastore2.file; cat /run/shm/datastore2.file>~/destination.file

当一个进程想要做某事的方式限制了你时,只需用逻辑和内存驱动器控制格式化即可。不要忘记在处理后移动数据,因为一旦重新启动, /run/shm/* 中的任何内容都会被删除。我希望这有帮助。我会密切关注,以防我误解了您的需求。

答案3

你可以将整个事情放入 shell 脚本中sort并在打印之前将 Awk 输出通过管道传输。

假设您想要排序输出上方和下方的行(这在视觉上对我来说更有意义):

#!/bin/sh
printf '%s\n' ------------------------
cat "$@" | awk -F: '($3 + $4 > 500) {print $1, $2}' | sort
printf '%s\n' ------------------------

myscript将其保存在名为set toexecutable 的文件中,并在inputfile您通过调用指定的上运行:

./myscript inputfile

输出看起来像:

------------------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32
------------------------

请注意使用"$@",以便该脚本可以处理多个文件参数,而不仅仅是一个,就像 Awk 可以做到的那样。

您也可以跳过使用cat并执行以下操作:

awk -F: '($3 + $4 > 500) {print $1, $2}' "$@" | sort

但是,我个人不喜欢在需要的地方传递文件名可以被解释为代码。所以我会用来cat连接文件。

相关内容