如何为文件生成与文件名中的唯一字符匹配的列?

如何为文件生成与文件名中的唯一字符匹配的列?

我有一堆文件

an_ar_chrom10_pos1_sun_td.txt
an_ar_chrom11_pos1_sun_td.txt
an_ar_chrom13_pos1_sun_td.txt
an_ar_chrom17_pos1_sun_td.txt
an_ar_chrom17_pos2_sun_td.txt
...

每个文件都有类似的格式,如下所示

head an_ar_chrom10_pos1_sun_td.txt
    "region" "start" "stop" "mid" "G1_TD" "G2_TD" "G3_TD" "G4_TD"
    "45000002 - 45010001 " 45000002 45010001 90.010003 NA NA NA NA
    "45010002 - 45020001 " 45010002 45020001 90.030003 -1.19087678772119 -0.947895467698369 -0.724767209958411 -0.957244005901499
    "45020002 - 45030001 " 45020002 45030001 90.050003 NA NA NA NA
    "45030002 - 45040001 " 45030002 45040001 90.070003 NA NA NA NA

我想根据每个文件名中的一些唯一字符向每个文件添加额外的列(例如第一个文件的 chrom10_pos1,第二个文件的 chrom11_pos1 等)

这是我想要的输出

head an_ar_chrom10_pos1_sun_td_with_id.txt
"region" "start" "stop" "mid" "G1_TD" "G2_TD" "G3_TD" "G4_TD" "ID_
"45000002 - 45010001 " 45000002 45010001 90.010003 NA NA NA NA chrom10_pos1
"45010002 - 45020001 " 45010002 45020001 90.030003 -1.19087678772119 chrom10_pos1-0.947895467698369 -0.724767209958411 -0.957244005901499 chrom10_pos1
"45020002 - 45030001 " 45020002 45030001 90.050003 NA NA NA NA chrom10_pos1
"45030002 - 45040001 " 45030002 45040001 90.070003 NA NA NA NA chrom10_pos1

答案1

我将使用可编写脚本的编辑器和文件名上的 shell 循环来处理它:

for f in *.txt
do
  value=$(printf '%s' "$f" | cut -d_ -f 3-4)
  printf '%s\n' '1s/$/ "ID"/' '2,$s/$/ '"$value"'/' 'wq' | ed -s "$f"
done

这将循环当前目录中的所有“*.txt”文件并编辑它们。循环中的第一行将文件名中所需的数据提取到变量中。第二行打印三个命令ed

  1. 1s/$/ "ID"/-- 更改第 1 行以附加新的列标题
  2. 2,$s/$/ $value/(从引用的值简化)——从第二行到文件末尾,用空格和所需数据替换行末尾。
  3. wq-- 将文件写入磁盘并退出

相关内容