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 表示 Jan 06,200602 表示 Feb 06,以此类推。

我知道如果我做类似的事情cat *.txt > data.txt,我可以合并我所有的文件。但是,仍然存在两个问题:

  1. 我在每个文件中都有一个可以连接的标题,这是我不想要的。
  2. 我会丢失存储在文件名中的月份信息。

我想我可以用 和 的某种组合来做到这一点catsed但我不知道如何开始。

4

2 回答 2

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

等等

于 2013-02-02T01:41:24.753 回答
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
于 2013-02-02T01:41:33.870 回答