2016-06-07 173 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 
    }'