Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 根据文件名添加特定标题_Bash_Shell - Fatal编程技术网

Bash 根据文件名添加特定标题

Bash 根据文件名添加特定标题,bash,shell,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_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)和国家名称(例如Country a)以及一个“1”,而不管测试文件或国家名称如何

例如,如果测试文件_1_from_Country_A_final.txt中的数据如下:

blablablabalabalbalablabbla
blabalalbblalbablablalbabla
blalalbablalblabblalbalbalb
blabalbalblbalbalbalbalbalb
abllablbalbalbalbalbalbalba
新文件应如下所示:

30 7 1
blablablabalabalbalablabbla
blabalalbblalbablablalbabla
blalalbablalblabblalbalbalb
blabalbalblbalbalbalbalbalb
abllablbalbalbalbalbalbalba
echo "30 7 1" > tmpfile
cat "$filename" >> tmpfile
mv tmpfile "$filename"
30因为它是国家A,7因为它是测试文件编号1,最后的1是每个文件必须的

额外信息

实际上,很多国家都有很多文件,所以最好有单独的文本文件,其中包含每个测试文件的编号以及需要添加到标题中的每个国家的编号


提前感谢。

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

for filename in testfile_*.txt
do
   ...
done
然后,您需要从每个文件名中提取测试文件号和国家。这可以通过在
上拆分文件名来完成,如下所示:

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

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

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

请解释一下→ 30和1→ 7.你有没有试着完成你所描述的?你有什么特别的困难吗?听起来您需要一个bash脚本,该脚本将文件名分成由下划线分隔的部分,选择与国家名称部分相对应的数字,然后打印数字和文件内容。我们是否应该理解文件名是脚本的一个命令行参数?@Alfe:对于国家a到Z,我有一个不同编号的列表,对于每个国家的文件1到22,我有另一个不同编号的列表。因此,根据每个国家的每个测试文件名,应该将不同的头组合添加到每个特定文件中。如何提供此列表?它在档案里吗?什么格式?@minopret:是的,我尝试使用if命令,使用-f查看文件是否有特定名称,然后尝试将某个内容回显到文件头的起始行,但我遇到了问题。我会尽快上传我得到它运行。很抱歉,我不理解您关于文件名和命令行参数的问题。我添加了一个用于字母/数字转换的
case
语句。根据转换列表的提供方式,可能有比列出所有组合更聪明的解决方案。我再次删除了愚蠢的
案例
逻辑,并添加了一个假设有两个转换文件的部分,对于给定的示例,每一行都包含像
A 30
1 7
这样的行。嗨,阿尔菲,很抱歉给您带来了新的不便,但实际上,作为示例的国家是佛得角、巴哈马,还有一些没有,例如秘鲁。我应该如何更改if语句?像这样??:testfile(0-9)+来自[A-Z,A-Z,Z])\u final.txt的。我采用了上面使用的regexp来匹配类似
佛得角
秘鲁
的内容。因为这不再是一封信了,我也把名字改成了
country
自始至终;-)现在我假设
countryConversionFile.txt
中有类似
Cape_Verde 30
Peru 31
的行。