比较连续行上的不同字段

时间:2015-12-11 11:25:58

标签: bash awk compare

我想比较连续行上的不同字段,如:

TYPE    DATE     TOTAL
p1      xxxx      1
p2      xxxx      2
p3      xxxx      1
p3      xxxx      2
p3      xxxx      1
p4      xxxx      2
p5      xxxx      1
p5      xxxx      2
p5      xxxx      1 

我想要一个最初会调查" Totals"对于= 1的条目,它将查看列类型,只要P与遇到1的条目保持相同,就需要将其输出到文件中。

示例结果:

p1   xxxx   1
p3   xxxx   1
p3   xxxx   2
p3   xxxx   1
p5   xxxx   1
p5   xxxx   2
p5   xxxx   1

我尝试使用bash,但代码是SUPER SLOW,还有其他方法吗?

temp=AAAAA
读取行时

做     键入= $ {线:20:1}     荚= $ {行:0:2}     日期= $ {线:9:5}

if [ "$type" != "2" ]
then
    echo $line >> outfile
fi

if [ "$POD" == "temp" ]
then
    echo line >> outfile
fi

temp=POD

done<$1

3 个答案:

答案 0 :(得分:2)

$ awk '$NF==1{t=$1} $1==t' file
p1      xxxx      1
p3      xxxx      1
p3      xxxx      2
p3      xxxx      1
p5      xxxx      1
p5      xxxx      2
p5      xxxx      1

上述内容将在眨眼之间运行,并且可以在所有问题中稳健运行。

说一个bash脚本对于操作文本来说很慢就像说你的自行车很慢,让你30英里上班。当然它很慢,它不是它的设计目的。 shell用于操作文件和进程以及对工具进行排序,而不是用于操作文本。用于操作文本的UNIX工具是awk - 这就是你应该使用的东西。获得Arnold Robbins的第四版Effective Awk编程一书。

答案 1 :(得分:0)

@echo OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
set "_zeroThroughNine=set /a _number=^!Random^! %% 10 & echo NUMBER=^!_number^!"
echo check variables 
set _
echo output
%_zeroThroughNine%
for /L %%G in (1,1,10) do %_zeroThroughNine%
echo check variables after evaluating 
set _
ENDLOCAL

最好的我管理得如此肥胖,但却非常痛苦。我认为每次旋转4个ifs:/

答案 2 :(得分:-1)

awk '{if($3==1){a=$1}if($1==a){print}}' your_file