提取组中的第一行

时间:2019-01-18 00:35:53

标签: shell awk sed

我有一个很大的文件,其中包含目录和文件的列表(由find生成)。它的内容是这样的:

./12345/a1abeff031.dat
./12345/a1abeef03a.dat
./12345/a1abefa032.dat
./12346/c3abeff031.dat
./12346/a1abeff031.dat
./12347/a2abeff021.dat

所以,我只需要每个目录一个文件(顺序无关紧要),期望的结果是这样的:

./12345/a1abeff031.dat
./12346/c3abeff031.dat
./12347/a2abeff021.dat

如何使用shell / awk / grep / sed或其他命令行工具获得此信息?

3 个答案:

答案 0 :(得分:2)

请您尝试一次。

awk -F'/' '!a[$2]++' Input_file

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -E ':a;N;s/^(([^/]*\/[^/]*\/).*)\n\2.*/\1/;ta;P;D' file

在整个文件中打开一个2行的窗口,并删除仅打印第一个目录的所有重复目录。

要打印一组重复的最后一个文件,请使用:

sed -E 'N;/^([^/]*\/[^/]*\/).*\n\1/!P;D' file

答案 2 :(得分:0)

使用Perl

perl -F"/" -lane ' print unless $kv{$F[1]}++ ' 

使用给定的输入

$ cat leonard.txt
./12345/a1abeff031.dat
./12345/a1abeef03a.dat
./12345/a1abefa032.dat
./12346/c3abeff031.dat
./12346/a1abeff031.dat
./12347/a2abeff021.dat
$ perl -F"/" -lane ' print unless $kv{$F[1]}++ ' leonard.txt
./12345/a1abeff031.dat
./12346/c3abeff031.dat
./12347/a2abeff021.dat
$