连接awk输出,字符串和文本文件

时间:2019-04-03 11:49:50

标签: bash awk

我的当前目录中有以下两个制表符分隔的文件。

a.tsv

class TakenQuizListView(ListView):

model = TakenQuiz
context_object_name = 'taken_quizzes'
template_name = 'classroom/students/taken_quiz_list.html'

def get_queryset(self):        
    queryset = self.request.user.student.taken_quizzes \
        .select_related('quiz', 'quiz__subject') \
        .order_by('quiz__name')
    return queryset

def get_context_data(self, **kwargs):
    total_score = self.request.user.student.total_score
    total_score  = Student.objects.get(total_score= 
  self.request.user.student.total_score)
    total_score = TakenQuiz.objects.aggregate(Sum('score'))
    total_score.save() #try update
    student = self.request.user.student

    context = super().get_context_data(**kwargs)
    context['total_score'] =  total_score['score__sum'] 
    return context

b.tsv

do  not use this    line
but this    one
and that    too

对于每个tsv文件,在同一目录中都有一个关联的txt文件,其文件名相同但后缀不同。

a.txt

three   fields  here
not here

b.txt

This is the a-specific text.

对于每对文件,我想创建一个具有相同名称但后缀_new.txt的新文件。新文件应包含相应tsv文件中的所有行,该行恰好包含3个字段,其后是字符串Text associated to b. ,然后是相应txt文件的全部内容。因此,应创建以下输出文件。

所需的输出

a_new.txt

\n####\n

b_new.txt

but this    one
and that    too

####
This is the a-specific text.

有效,但解决方案不好

three   fields  here

####
Text associated to b.

非工作代码

我想用一个脚本来获得结果,并避免创建带有后缀for file in ./*.tsv do awk -F'\t' 'NF==3' $file > ${file//.tsv/_3_fields.tsv} done for file in ./*_3_fields.tsv do cat $file <(printf "\n####\n") ${file//_3_fields.tsv/.txt} > ${file//_3_fields.tsv/_new.txt} done 的中间文件。 我尝试了如下命令替换:

_3_fields.tsv

但这不会将经过awk处理的部分写入新文件中。

但是,如果仅将经awk处理的部分写入新文件中,则命令替换似乎可以正常工作,如下所示:

for file in ./*.tsv
do cat <<< $(awk -F'\t' 'NF==3' $file) <(printf "\n####\n") ${file//.tsv/.txt} > ${file//.tsv/_new.txt}
done

我会对为何倒数第二个代码无法按预期工作以及执行该任务的好解决方案感兴趣。

1 个答案:

答案 0 :(得分:5)

也许您想重定向一系列命令

for file in ./*.tsv
do 
    {
        awk -F'\t' 'NF==3' "$file"
        printf "\n####\n"
        cat "${file//.tsv/.txt}"
    } > "${file//.tsv/_new.txt}"
done

请注意,在打开大括号和分号或换行符之前的空格很重要。

似乎您还在混淆命令替换$()和进程替换<()>()。另外,<<<会将内容重定向为标准输入,而<会将文件重定向。