在循环中使用 sed

在循环中使用 sed

我有具有.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 :不自动打印模式空间。
    • -Efor --regexp-extended :使用扩展正则表达式
  • ([^,]*):捕获时间戳

  • .*lie$ :确保该行以“lie”结尾

因此: 将返回从第 13 行开始的“lie”的时间戳

相关内容