如果同一行中的另一个字符串出现多次,则提取特定字符串

时间:2018-08-07 15:45:51

标签: bash shell unix

我不得不仔细改写这个问题:)

仅当另一个字符串(在同一行中)在文件中出现两次时才需要尝试提取字符串。 (平台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

任何帮助将不胜感激。

1 个答案:

答案 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