我的当前目录中有以下两个制表符分隔的文件。
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
我会对为何倒数第二个代码无法按预期工作以及执行该任务的好解决方案感兴趣。
答案 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
请注意,在打开大括号和分号或换行符之前的空格很重要。
似乎您还在混淆命令替换$()
和进程替换<()
或>()
。另外,<<<
会将内容重定向为标准输入,而<
会将文件重定向。