2013-02-02 28 views
1

我有多個製表符分隔的數據文件,格式爲jan06.txt, feb06.txt, ..., dec07.txt,按月份分隔。將多個數據文件與標題組合在一起,同時還添加了一個數據列

中的每個文件,它看起來是這樣的:

Header1 Header2 Header3 ... 
Data1 Data2 Data3 ... 
Data4 Data5 Data6 ... 
...  ...  ... 

我想要做的是所有的所有數據文件的頂部組合成一個單一的數據文件中,只有一個頭,而且還包含一個包含月份和年份的新數據列,這樣我就不會從文件名中丟失該信息。所以,我的新的,單個數據文件將包含:

Date Header1 Header2 Header3 ... 
200601 Data1 Data2 Data3 ... 
200602 Data4 Data5 Data6 ... 
... ...  ...  ... 

200601哪裏會提到1月6,200602是指2月6等

我知道,如果我這樣做cat *.txt > data.txt,我可以將所有我的文件。但是,這兩個問題仍然存在:

  1. 我在每個文件中都會有一個頭文件,這些頭文件將會被連接起來,這是我不想要的。
  2. 我將失去存儲在文件名中的月份信息。

我想我可以用catsed的組合來做到這一點,但我不確定如何開始。

+1

同時要求在[超級用戶(http://superuser.com/q/545315/4714 ) –

回答

1

嘗試以下方法:

function month() { 

    case ${1:0:3} in 
     "jan") echo "20${1:3:2}01" ;; 
     "feb") echo "20${1:3:2}02" ;; 
     "mar") echo "20${1:3:2}03" ;; 
     "apr") echo "20${1:3:2}04" ;; 
     "may") echo "20${1:3:2}05" ;; 
     "jun") echo "20${1:3:2}06" ;; 
     "jul") echo "20${1:3:2}07" ;; 
     "aug") echo "20${1:3:2}08" ;; 
     "sep") echo "20${1:3:2}09" ;; 
     "oct") echo "20${1:3:2}10" ;; 
     "nov") echo "20${1:3:2}11" ;; 
     "dec") echo "20${1:3:2}12" ;; 
    esac 

} 

# Header 
directory="your_directory/" 
echo -en "Date\t" > data.txt 
head -1 $(ls "${directory}"/*.txt | head -1) >> data.txt 

# Contents 
for file in "${directory}"/*.txt; do 

    date="${file##*/}" 
    date="$(month ${date%*.txt})\t" 
    tail -n +2 ${file} | sed 's/^/'${date}'/' >> data.txt 

done 
1

例如:

echo -e 'Date\tHeader1\tHeader2\tHeader3 ...' >out 
sed -n -e 's/^/200601\t/' -e '2,$p' <jan06.txt >>out 
sed -n -e 's/^/200602\t/' -e '2,$p' <feb06.txt >>out 

+1

或'sed -n -e'2,$ s/^/200601 \ t/p''(其中'-e'現在是可選的)? – Scott

相關問題