Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell awk内的管道是如何工作的(通过保留标题进行排序)_Shell_Awk - Fatal编程技术网

Shell awk内的管道是如何工作的(通过保留标题进行排序)

Shell awk内的管道是如何工作的(通过保留标题进行排序),shell,awk,Shell,Awk,下面的命令输出文件的头,并在头之后对记录进行排序。但是它是如何工作的呢?有人能解释一下这个命令吗 awk 'NR == 1; NR > 1 {print $0 | "sort -k3"}' 请你把下面的内容再看一遍(仅供解释)。要了解有关awk的更多概念,我建议您通过 |是一个-在本例中是管道到命令排序-k3。您还可以使用重定向来写入文件,方法是使用: awk 'NR == 1; NR > 1 {print $0 > "output.txt&qu

下面的命令输出文件的头,并在头之后对记录进行排序。但是它是如何工作的呢?有人能解释一下这个命令吗

awk 'NR == 1; NR > 1 {print $0 | "sort -k3"}'

请你把下面的内容再看一遍(仅供解释)。要了解有关
awk
的更多概念,我建议您通过

|
是一个-在本例中是管道到命令
排序-k3
。您还可以使用重定向来写入文件,方法是使用

awk 'NR == 1; NR > 1 {print $0 > "output.txt"}'
awk 'NR == 1; NR > 1 {print $0 >> "output.txt"}'
或使用
>>
附加到文件:

awk 'NR == 1; NR > 1 {print $0 > "output.txt"}'
awk 'NR == 1; NR > 1 {print $0 >> "output.txt"}'

第一个将写入文件
output.txt
除第一行以外的所有行,第二个将追加到
output.txt
除第一行以外的所有行。

了解awk命令: 总体而言,awk程序是由
(pattern){action}
对构建的,该对统计如果
pattern
返回非零值,则执行
action
。一个人不一定要同时写两个。如果省略了
模式
,则默认为
1
;如果省略了
操作
,则默认为
打印$0

查看相关命令时:

awk 'NR == 1; NR > 1 {print $0 | "sort -k3"}'
我们注意到有两个动作模式对。第一个读取
NR==1
,并声明如果我们正在处理第一条记录(模式),则打印该记录(默认操作)。第二个有点棘手。模式是明确的,另一方面,行动需要一些解释

awk知道4条可以重定向输出的输出语句。其中一个是
expression | cmd
。它本质上意味着awk将把输出写入一个流,该流通过管道作为命令
cmd
的输入。它将继续向该流写入输出,直到使用
close(cmd)
语句或简单地终止awk显式关闭该流

对于OP,该操作读取
{print$0 |“sort-k3”}
,这意味着它将把所有记录
$0
打印到一个流中,该流用作shell命令
sort-k3
的输入。只有当程序完成时,
排序
才会写入其输出

重述:OP的命令将打印文件的第一行,并根据第三列对连续行进行排序

替代解决方案:

使用GNU awk,最好执行以下操作:

awk '(FNR==1);{a[$3]=$0}
     END{PROCINFO["sorted_in"]="@ind_str_asc"
        for(i in a) print a[i]
     }' file
cat file | (read -r; printf "%s\n" "$REPLY"; sort -k3)
使用纯shell时,最好执行以下操作:

awk '(FNR==1);{a[$3]=$0}
     END{PROCINFO["sorted_in"]="@ind_str_asc"
        for(i in a) print a[i]
     }' file
cat file | (read -r; printf "%s\n" "$REPLY"; sort -k3)
相关问题:


在NR==1之后没有{print},它是通过default@VipulBajaj,是的
awk
使用
条件的方法
然后
操作
因为这里没有提到任何操作,所以默认情况下会打印当前行,干杯。非常感谢您的提示和清晰explanation@VipulBajaj,欢迎您的光临,并祝您学习愉快。很好地使用了内置的shell命令
awk