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