将多个数据文件与标题组合,同时还添加数据列

时间:2013-02-02 01:21:57

标签: bash shell

我有多个制表符分隔的数据文件,按月以[{1}}格式分隔。

在每个文件中,它看起来像:

jan06.txt, feb06.txt, ..., dec07.txt

我想要做的是将所有数据文件合并到一个数据文件中,顶部只有一个标题,但也包含一个包含月份和年份的新数据列,所以我不会丢失来自文件名的信息。所以我的新单个数据文件将包含:

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

200601指的是06年1月6日,200602指的是2月06日等。

我知道如果我执行Date Header1 Header2 Header3 ... 200601 Data1 Data2 Data3 ... 200602 Data4 Data5 Data6 ... ... ... ... ... 之类的操作,我可以合并所有文件。但是,这两个问题仍然存在:

  1. 我在每个文件中都有一个标题会被连接起来,这是我不想要的。
  2. 我将丢失存储在文件名中的月份信息。
  3. 我认为我可以使用cat *.txt > data.txtcat的某种组合执行此操作,但我不确定如何开始。

2 个答案:

答案 0 :(得分: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 :(得分: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