Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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
使用awk或gawk脚本设计输出_Awk_Gawk - Fatal编程技术网

使用awk或gawk脚本设计输出

使用awk或gawk脚本设计输出,awk,gawk,Awk,Gawk,我有一个awk脚本,它在一个.txt文件中给出了我想要的结果,但我关心的是结果是如何给出的:我把所有这些都放在一行中,我想设计它 20140201 -73828274 20140202 7376288374 20140203 3837482437 ....... 20140228 -73629277 我希望输出以这种格式显示 20140201 -73828274 20140202 7376288374 20140203 3837482437 n

我有一个awk脚本,它在一个.txt文件中给出了我想要的结果,但我关心的是结果是如何给出的:我把所有这些都放在一行中,我想设计它

20140201 -73828274 20140202 7376288374 20140203 3837482437 ....... 20140228 -73629277
我希望输出以这种格式显示

20140201          -73828274
20140202         7376288374
20140203         3837482437
n                  n
n                  n
n                  n
20140228           73629277
我想把日期放在一边,相应的总数放在日期前面

这里使用了awk脚本

$ for file in *.txt;do awk -F,'NR==1{header=$0; next} {a[$1]+=$6+$14} END {for (i in a) {print i, a[i]};}' $file; done > red.txt

有什么想法吗?

您可以使用
printf
而不是
print
。将
awk
脚本的
END{}
部分更改如下:

END {for (i in a) {printf "%d\t%d\n", i, a[i]};}
在两个值(
%d
)之间,它打印一个选项卡(
\t
),并在末尾打印一个换行符(
\n

或您的完整命令:

for file in *.txt;do awk -F,'NR==1{header=$0; next} {a[$1]+=$6+$14} END {for (i in a) {printf "%d\t%d\n", i, a[i]};}' $file; done > red.txt

使用
grep
tr
如下所示

$ grep -oP '\S+\s+\S+' file | tr ' ' '\t'
20140201    -73828274
20140202    7376288374
20140203    3837482437
20140228    -73629277

她是使用
awk

awk -v RS=" " 'ORS=NR%2?RS:"\n"' file
20140201 -73828274
20140202 7376288374
20140203 3837482437
首先,我们将记录选择器设置为空格,因此每个日期都是一个新行。
然后根据奇偶行号将输出记录选择器更改为空格或换行符


您也可以将
getline
用于此操作,但请注意,
getline
有许多陷阱

awk -v RS=" " '{a=$0;getline;print a,$0}' file
20140201 -73828274
20140202 7376288374
20140203 3837482437

通过这种方式,您可以使用
printf

对输出进行更多控制。您不需要shell循环,awk完全能够处理多个文件,例如,使用GNU awk处理ENDFILE和delete array:

awk -F, 'FNR>1{a[$1]+=$6+$14} ENDFILE{for (i in a) print i, a[i]; delete a}' *.txt > red.txt
上述内容显然未经测试,因为您没有提供任何示例输入

您发布的脚本无法生成您显示的输出。在awk脚本运行之后,您还需要执行一些其他操作,以使输出文件的所有行都显示在一行上。我怀疑您可能没有再次引用变量(就像您没有在脚本中引用
$file
),并执行以下操作:

var=$(cat red.txt)
echo $var

一旦脚本运行完毕,只需执行
cat red.txt
,您就会发现内容并不像您所说的那样全部在一行上。

基本上就是您打印输出的方式。你能分享脚本以便我们提出修改建议吗?@kannamohan我添加了脚本它在shell上运行良好,但当打印到txt文件时,我仍然有相同的问题你有相同的问题,因为该问题与你的awk脚本无关。无论你在做什么,都可以显示文件的内容。在shell上也可以!我有我想要的设计,但当我想要在txt文件上输出时,我仍然在一行上保留所有元素awk-v RS=“”{a=$0;getline;print a,$0}file>output.txt“这是我使用的脚本”没关系,我修复了它:)