我不得不仔细改写这个问题:)
仅当另一个字符串(在同一行中)在文件中出现两次时才需要尝试提取字符串。 (平台Unix,可以使用ksh / awk / sed) 例如
list.txt包含:
Found 2 items
-rwxr-xr-x 3 xyz hdfs 21696 2018-08-06 11:57 some_table/event_dt=2018-05-12/event_hr=20/000000_0
-rwxr-xr-x 3 xyz hdfs 21696 2018-08-06 11:57 some_table/event_dt=2018-05-12/event_hr=23/000000_0
Found 2 items
-rw-r--r-- 3 xyz hdfs 33006 2018-08-06 11:32 some_table/event_dt=2018-05-13/event_hr=01/part-00001-6c3c68ff-3792-4810-847a-1ce73d8b8a69.c000
-rw-r--r-- 3 xyz hdfs 33006 2018-08-06 11:32 some_table/event_dt=2018-05-13/event_hr=01/part-00000-fb3fc3fb-4960-4674-a8e5-7c600ec43b49.c000
-rw-r--r-- 3 xyz hdfs 33006 2018-08-06 11:32 some_table/event_dt=2018-05-13/event_hr=02/part-00000-fb3fc3fb-4960-4674-a8e5-6938600ec43b49.c000
Found 2 items
-rw-r--r-- 3 xyz hdfs 33006 2018-08-06 11:32 some_table/event_dt=2018-05-14/event_hr=07/part-00001-6c3c68ff-3792-4810-847a-1ce7823469.c2302
-rw-r--r-- 3 xyz hdfs 33006 2018-08-06 11:32 some_table/event_dt=2018-05-14/event_hr=07/part-00000-fb3fc3fb-4960-4674-9238-1239-ec43b49.c000
鉴于上述文件,我需要提取所有event_dt =“?”只要该特定event_dt的event_hr出现不止一次,就将它们用于后续操作。对于上述情况,它将忽略“ 2018-05-12”(因为所有event_hr都只出现一次)。 **编辑:我相信,在扫描文件时,如果没有一种方法可以存储event_dt,也许可以将event_dt列表存储在另一个文件中,并使用这些循环循环其他操作。
上面的将输出文件。
result.txt,其中包含:
2018-05-13
2018-05-14
任何帮助将不胜感激。
答案 0 :(得分:2)
如果您的文件仅包含您所显示格式的行,我们可以删除“ Found”行,其中没有任何event_dt
/ event_hr
信息,
grep -v Found
然后可以将其传递到sed中以提取出event_dt
/ event_hr
值。您的输入建议将不同的值/分开,所以:
sed 's/.*event_dt=\(.*\)\/event_hr=\(.*\)\/.*/\1 \2/'
然后我们要重复几行;即event_dt
/ event_hr
都匹配的地方。您无需指明是否对行进行分组,为安全起见,我们先行sort
(将它们分组)然后uniq -d
现在,这将为我们提供event_dt
/ event_hr
配对的列表。最后,我们只需要event_dt
,所以我们可以使用
awk '{print $1}'
以防万一我们仍然有重复项(例如,具有多个重复的event_dt
值的event_hr
,我们将删除具有uniq
的重复项。
这给我们:
grep -v Found list.txt | sed 's/.*event_dt=\(.*\)\/event_hr=\(.*\)\/.*/\1 \2/' | sort | uniq -d | awk '{print $1}' | uniq