2016-06-07 170 views
1

我有一些路径中的文件。说当我这样做ls -lrt,我得到获取基于位置和分隔符的unix子字符串

20160401_RM_ARN_MAPPING-M_RTL_NORTH_DELH_101.csv 
20160401_RM_ARN_MAPPING-M_RTL_NORTH_DELH_102.csv 
20160401_RM_ARN_MAPPING-M_BND_NORTH_DELH_102.csv 
20160405_RM_ARN_MAPPING-M_RTL_NORTH_DELH_101.csv 
20160405_RM_ARN_MAPPING-M_RTL_NORTH_DELH_102.csv 
20160401_MAP_RTL_BANK-M_RTL_NORTH_DELH_101.csv 
20150401_RM_ARN_MAPPING-M_RTL_NORTH_DELH_101.csv 

我希望日后不同的文件名和前“ - ”分隔符。

我试图

ls -lrt | awk '{print $9}' | sed '1d' | awk -F'-' '{print $1}' 

它给

20160401_RM_ARN_MAPPING 
20160401_RM_ARN_MAPPING 
20160401_RM_ARN_MAPPING 
20160405_RM_ARN_MAPPING 
20160405_RM_ARN_MAPPING 
20160401_MAP_RTL_BANK 
20150401_RM_ARN_MAPPING 

但我想删除的日期后只有

RM_ARN_MAPPING 
MAP_RTL_BANK 

作为输出,即不同的名称。这里前8个字符是固定的,它将是YYYYMMDD格式。

+0

你使用bash吗?你在linux吗?这些都是可能相关的东西 – fedorqui

回答

0

可以做到这样: -

ls -ltr|sed 1d|awk '{print $9}'|cut -d"-" -f1 |cut -d_ -f2-|sort|uniq 

解释

LS -ltr - >列表文件

sed的1D - >忽略第一

awk'{print $ 9}' - > print 9th column

其他我认为自解释

1

添加cut -d '_' -f 2-

ls -lrt | awk '{print $9}' | sed '1d' | awk -F'-' '{print $1}' | cut -d '_' -f 2- 

2-意味着第二部分和一切向端..

+0

非常感谢。这正是我正在寻找.. –

+0

@PavaniSrujana检查其他答案,并请选择一个接受..其他的更好,我只是愚蠢地添加切,但最好不要使用ls和解析.. – nayana

+0

@otoplosky。我经历了所有的选择,并使用其中的3个实际上在我的代码的许多不同的托盘。感谢很多 –

3

Do not parse ls。相反,循环访问您的目录中的元素并keep track of the new names with an array。为了获得干净的数据,使用shell parameter expansion

for file in your_dir/*; do 
    no_date=${file#*_}    # remove up to the first _ 
    no_dash=${no_date%%-*}   # remove from the first - 
    [[ " ${var[@]} " =~ " ${no_dash} " ]] || var+=($no_dash) 
done 

然后,检查与元素:

$ printf "%s\n" "${var[@]}" 
RM_ARN_MAPPING 
MAP_RTL_BANK 
+0

请注意,该问题指定'ls -lrt' - 这是基于修改时间进行(反向)排序。 –

+0

@MichaelBack我不认为这里的排序很重要 – fedorqui

1

这个答案解析避免输出ls - 防范含奇怪字符的文件名 - 模拟-lrt安全使用stat与空字符记录分隔符输出和互补sort\0也可以用作awk分隔符,我们可以使用该工具进行文本操作的其余部分。前导数字和下划线的去除用正则表达式/^[^_]+_/处理。重复“名称”的删除是通过关联数组查找完成的。

stat --printf '%Y %n\0' *_*-*.csv | 
    sort -nz | 
    awk -v RS='\0' '{ 
      sub(/^[^_]+_/, "") 
      sub(/-.*$/, "") 
      if ($0 in y) 
       next 
      y[$0]=1 
      print 
    }'