我有具有.txt
以下结构的文件:
20170515000650883,208,-32,-896,stand
20170515000651883,336,96,-928,stand
20170515000652982,368,64,-896,stand
20170515000653982,256,-48,-816,lie
20170515000654982,368,48,-832,lie
20170515000655982,15081,32,-688,lie
20170515000656982,15081,48,-864,lie
20170515000657983,15081,112,-1072,lie
20170515000658983,15081,-32,-992,lie
20170515000659983,15081,-48,-1072,lie
20170515000700983,15081,-32,-880,lie
20170515000701983,15081,16,-832,stand
20170515000702983,15081,-48,-720,stand
20170515000703983,15081,0,-896,stand
20170515000704983,15081,112,-880,lie
20170515000705983,15081,-48,-1072,lie
...
我的目标是搜索lie
最后一列中表示的事件。这是我意识到的
sed -n '13,$s/lie/&/p' $subj > $SUBJECTS_DIR/temp.txt
我从第 13 行开始搜索,并将所有带有“lie”的行保存到我的临时文件中。但是可以在 sed 命令期间收集数据吗?第一列包含时间戳:所以当 lie=TRUE 时我想从 column_1 收集值;另外,当该序列的最后一个谎言(总共8个“谎言”)出现时,需要column_1的相应值来计算时间差。搜索应该继续到文件结束。有人知道如何在期间收集这些信息吗? sed?
答案1
为此,您可以使用 awk。
awk -F"," '/lie/{a[++i>2?2:i]=$1}END{print a[2] - a[1] }' 输入 .txt
awk 命令将在数组中存储与“lie”匹配的第一个和最近的时间戳。读取文件后,awk 将从最后一个匹配项中减去第一个匹配项。
答案2
我不清楚什么是“时间差”,但是带有“谎言”的第一列可以用以下命令简单地扩展:
cat data.txt | grep lie | sed "s/,.*,lie//g"
grep
丢弃所有没有“lie”的行并sed
删除除第一列之外的所有行。
然后,您可以将其转换为数组并在 bash 中使用所需的数字
答案3
发布此内容可能为时已晚:
sed -nE '13,$ s/([^,]*).*lie$/\1/p' in.txt
在哪里:
-nE
:-
- -n 代表 --quiet, --silent :不自动打印模式空间。
- -n 代表 --quiet, --silent :不自动打印模式空间。
-
-E
for --regexp-extended :使用扩展正则表达式
([^,]*)
:捕获时间戳.*lie$
:确保该行以“lie”结尾
因此: 将返回从第 13 行开始的“lie”的时间戳