数据:
61 -3.5527 1.00000
62 -3.4695 1.00000
63 -3.4545 1.00000
64 -3.1462 1.00000
65 -1.4512 0.00000
66 -1.1737 0.00000
67 -0.8792 0.00000
61 -3.5590 1.00000
62 -3.4763 1.00000
63 -3.4557 1.00000
68 -3.1533 1.00000
69 -1.4382 0.00000
70 -1.1616 0.00000
71 -0.8638 0.00000
我的期望:
文件1:
64 -3.1462 1.00000
68 -3.1533 1.00000
file2的:
65 -1.4512 0.00000
69 -1.4382 0.00000
我想通过简单地使用bash shell和awk来获取file1和file2。 如何找到第3列的值从1更改为0的两行? Thx提前!
答案 0 :(得分:5)
试试这个awk
脚本:
NR == 1 { last = $3; }
last == 1 && $3 == 0 { print previous > "file1" ; print $0 > "file2" ; }
last != $3 { last = $3; }
{ previous = $0 }
此操作如下:如果行号为1,则将第三列记录为last
。如果last等于1且当前行的第三列等于0,则将变量previous
的内容打印到file1,将当前行打印到file2。如果last
的值不等于当前行的第三列,请更改变量的值。最后,将当前行记录为previous
,以便在第二条规则中使用。
由于没有必要初始化last
,或检查第三列的值是否已更改,脚本可以缩短为:
last == 1 && $3 == 0 { print previous > "file1" ; print $0 > "file2" ; }
{ last = $3; previous = $0 }
答案 1 :(得分:0)
awk 'BEGIN{prev=1; prevRec=""} prev == 1 && prevRec != "" && $3 == 0{print $0 > "file1";print prevRec > "file2"} {prev = $3; prevRec=$0}' file
答案 2 :(得分:0)
awk '{ tmp=match($3,/[1][.]?????/) ; if (tmp) { lineone=$0 ; newzero=0 ;} else if ( newzero <1) { onechanged[lineone]=1 ; zerochanged[$0]=1 ; newzero=1} } END { print "File1 is: " ; for (key in onechanged){ print key } ; print "File2 is:" ; for (key in zerochanged){ print key }}' test.txt
输出是:
File1 is:
64 -3.1462 1.00000
68 -3.1533 1.00000
File2 is:
69 -1.4382 0.00000
65 -1.4512 0.00000
答案 3 :(得分:0)
awk '
NR>1 && last==1 && $3==0 {
print last_line > "file1"
print $0 > "file2"
}
{
last=$3
last_line=$0
}
' input.txt
awk 'NR>1&&x==1&&$3==0{print y>"file1";print $0>"file2"}{x=$3;y=$0}' input.txt