根据文件名添加特定标头

时间:2014-02-05 12:20:47

标签: bash shell

我有一些具有以下名称的文本文件:

testfile_1_from_Country_A_final.txt
testfile_2_from_Country_A_final.txt

testfile_1_from_Country_B_final.txt
testfile_2_from_Country_B_final.txt

testfile_1_from_Country_C_final.txt
testfile_2_from_Country_C_final.txt

我必须添加一个特定的标题,每个文件由三个数字组成,具体取决于测试文件的编号(例如testfile_1)和国家的名称(例如国家A)和“1”。测试文件或国家/地区名称。

例如,如果来自测试file_1_from_Country_A_final.txt的数据是:

blablablabalabalbalablabbla
blabalalbblalbablablalbabla
blalalbablalblabblalbalbalb
blabalbalblbalbalbalbalbalb
abllablbalbalbalbalbalbalba

新文件应如下所示:

30 7 1
blablablabalabalbalablabbla
blabalalbblalbablablalbabla
blalalbablalblabblalbalbalb
blabalbalblbalbalbalbalbalb
abllablbalbalbalbalbalbalba

30,因为它是国家A和7,因为它是test_file编号1,最后1是每个文件必须的。

额外信息

实际上很多国家都有很多文件,所以也许最好有单独的文本文件,其中包含每个test_file数字的编号以及需要添加到标题中的每个国家/地区的编号。 / p>

提前致谢。

2 个答案:

答案 0 :(得分:1)

使用此选项拆分文件名,转换元素并在文件中插入标题行:

for fileName in testfile*.txt
do
  if [[ "$fileName" =~ testfile_([0-9]+)_from_Country_([A-Za-z_]+)_final.txt ]]
  then
    number=${BASH_REMATCH[1]}
    country=${BASH_REMATCH[2]}

    # now convert the number and the country
    convertedNumber=$(grep "^$number " numberConversionFile.txt | cut -d' ' -f2)
    convertedCountry=$(grep "^$country " countryConversionFile.txt | cut -d' ' -f2)

    sed -i "1i$convertedCountry $convertedNumber 1" "$fileName"
  fi
done

答案 1 :(得分:0)

这里涉及几个步骤。首先,您需要迭代文件。这可以使用for循环来完成:

for filename in testfile_*.txt
do
   ...
done

然后,您需要从每个文件名中提取测试文件编号和国家/地区。这可以通过在_上拆分文件名来完成,如下所示:

IFS=_ read -a arr <<< "$filename"
test_file_num="${arr[1]}"
country="${arr[4]}"

接下来,您需要将测试文件编号和国家/地区转换为数字。您尚未提供有关如何将国家/地区A变为数字30的信息。

最后,您需要将标头写入每个文件。这可以使用这样的临时文件来完成:

echo "30 7 1" > tmpfile
cat "$filename" >> tmpfile
mv tmpfile "$filename"