在页眉和页脚字符串之间的文件中的awk行

时间:2016-08-31 05:39:32

标签: variables awk header

我尝试使用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方法,但我认为我的语法需要一些帮助。如果有人通过更有经验的眼睛有任何建议,我将不胜感激。如果有什么事情不清楚,请告诉我。

谢谢,

马特

2 个答案:

答案 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”