我尝试使用for循环中的awk脚本解析不同页眉和页脚之间的所有行到不同的文件。例如,我有一个文件,其中包含与样本名称标题不匹配的列表( compiled.csv ),如下所示:
19-T00,,,,,,,,,,,,,,,,
1557,WT,,,,,,,,,,,,,,,
6,109-G->A,110-G->A,,,,,,,,,,,,,,
3,183-G->A,,,,,,,,,,,,,,,
19-T10,,,,,,,,,,,,,,,,
642,WT,,,,,,,,,,,,,,,
206,24->G,,,,,,,,,,,,,,,
19-T21,,,,,,,,,,,,,,,,
464,24->G,,,,,,,,,,,,,,,
19-TSpl,,,,,,,,,,,,,,,,
2219,24->G,,,,,,,,,,,,,,,
20-T00,,,,,,,,,,,,,,,,,,
...
...
上述行的目标是将19-T00
中的所有行传递到名为2219,24->G,,,,,,,,,,,,,,,
的示例输出文件中的sample-19.csv
。
样本名称共享模式[0-9][0-9]-T*
。我首先要做的是基于创建一个包含所有20个样本名称(即19,20,21 ......)的数组。我正在尝试执行以下循环,并创建输出文件,但它们是空白的。
for i in {0,19}
do a="$i"
b=`echo $i+1 | bc`
header="${array[$a]}-T"; footer="${array[$b]}-T"
name=`echo $header | cut -d"-" -f1`
awk -F, -v start="$header" -v finish="$footer" '/^start*/,/^finish*/' compiled.csv >"sample-"$name".csv"
done
如果我使用单行手动执行此操作:
awk '/^19-T*/,/^20-T*/' compiled.csv >sample-19.csv
它运作正常。所以我认为变量传递可能存在问题,但我不知道如何修复它。
我知道有一些其他线程使用awk讨论header-footer方法,但我认为我的语法需要一些帮助。如果有人通过更有经验的眼睛有任何建议,我将不胜感激。如果有什么事情不清楚,请告诉我。
谢谢,
马特
答案 0 :(得分:0)
你需要的就是这样(未经测试):
awk '
/^[0-9][0-9]-T00,/ {
close(out)
out = "sample-" $0
sub(/-T00.*/,".csv",out)
}
{ print > out }
' compiled.csv
如果您再次考虑使用shell循环处理文本,请务必先阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice
答案 1 :(得分:0)
使用awk
awk --posix '/[0-9]{2}-T00/{split($0,a,"-"); name=a[1]} {print $0>"sample-"name".cas"}' file
输出将为您的内容输出两个文件“sample-19.csv”和“sample-20.csv”