因此,我有一个以日期(yyyymmdd)开头的文件列表,然后它们有不同的结尾。我想过滤所有的日期和查找uniq的日期,并计算它们。所以像这样的伪码:
ls | grep 'file[0:8]' | unique | wc -l
但这显然行不通。那么,对于如何更容易地做到这一点,有什么办法吗?我掌握的数据如下所示:
20160124_vv_iw2.slc 20170118_vv_iw2.slc.tops_par 20190120_vv_iw2.slc.par
20160124_vv_iw2.slc.par 20170915_vv_iw2.slc 20190120_vv_iw2.slc.tops_par
20160124_vv_iw2.slc.tops_par 20170915_vv_iw2.slc.par 20200911_vv_iw2.slc
20160827_vv_iw2.slc 20170915_vv_iw2.slc.tops_par 20200911_vv_iw2.slc.par
20160827_vv_iw2.slc.par 20180113_vv_iw2.slc 20200911_vv_iw2.slc.tops_par
20160827_vv_iw2.slc.tops_par 20180113_vv_iw2.slc.par 20200923_vv_iw2.slc
20170118_vv_iw2.slc 20180113_vv_iw2.slc.tops_par 20200923_vv_iw2.slc.par
20170118_vv_iw2.slc.par 20190120_vv_iw2.slc 20200923_vv_iw2.slc.tops_par发布于 2020-11-12 18:42:46
printf "%-8.8s\n" * | uniq | wc -l更广泛地说,你可以做一些类似的事情
for file in *; do
echo "${file:0:8}"
done | uniq | wc -l就像任何面向行的方法一样,如果文件名中有换行符,这种情况就会中断。
如果您只想在第一个下划线处拆分,"${file%%_*}"就会这样做。
发布于 2020-11-12 15:40:36
ls -1 | sed -E 's/^[^_]+_//' | sort -u | wc -l或
ls -1 | sed -E 's/^[[:digit:]]+_//' | sort -u | wc -l发布于 2020-11-12 17:03:29
使用此Perl一行程序,并结合uniq | wc -l。
perl -le 'print sort /^(\d+)/ for glob "*";' | uniq | wc -l
8Perl一行程序使用以下命令行标志:
-e:告诉Perl在行中查找代码,而不是在文件中。
-l:在执行代码行之前,先去掉输入行分隔符(默认情况下是*NIX上的"\n"),然后在打印时追加它。
glob "*"返回所有文件和目录的列表。
/^(\d+)/返回regex匹配项,这里是文件名开头的数字段。如果您需要确切的数字数,请使用类似于/^(\d{8})/的内容。
还请参见:
perldoc perlrun: how to execute the Perl interpreter: command line switches
https://stackoverflow.com/questions/64806785
复制相似问题