我的当前目录中有以下两个制表符分隔的文件。
电视
do not use this line
but this one
and that too
Run Code Online (Sandbox Code Playgroud)
电视
three fields here
not here
Run Code Online (Sandbox Code Playgroud)
对于每个tsv文件,在同一目录中都有一个关联的txt文件,其文件名相同但后缀不同。
a.txt
This is the a-specific text.
Run Code Online (Sandbox Code Playgroud)
b.txt
Text associated to b.
Run Code Online (Sandbox Code Playgroud)
对于每对文件,我想创建一个名称相同但后缀为_new.txt的新文件。新文件应包含相应tsv文件中的所有行,该行恰好包含3个字段,其后是string \n####\n,然后是相应txt文件的全部内容。因此,应创建以下输出文件。
a_new.txt
but this one
and that too
####
This is the a-specific text.
Run Code Online (Sandbox Code Playgroud)
b_new.txt
three fields here
####
Text associated to b.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我想使用一个脚本来获得结果,并避免使用后缀创建中间文件_3_fields.tsv。我尝试了如下命令替换:
for file in ./*.tsv
do cat <<< $(awk -F'\t' 'NF==3' $file) <(printf "\n####\n") ${file//.tsv/.txt} > ${file//.tsv/_new.txt}
done
Run Code Online (Sandbox Code Playgroud)
但这不会将经过awk处理的部分写入新文件。
但是,如果仅将awk处理的部分写入新文件,则命令替换似乎可以正常工作,如下所示:
for file in ./*.tsv; do cat <<< $(awk -F'\t' 'NF==3' $file) > ${file//.tsv/_new.txt}; done
Run Code Online (Sandbox Code Playgroud)
我想知道为什么倒数第二个代码无法按预期工作,以及执行此任务有什么好的解决方案。
也许您想重定向一系列命令
for file in ./*.tsv
do
{
awk -F'\t' 'NF==3' "$file"
printf "\n####\n"
cat "${file//.tsv/.txt}"
} > "${file//.tsv/_new.txt}"
done
Run Code Online (Sandbox Code Playgroud)
请注意,打开括号后的空间很重要,而关闭括号前的分号或换行符很重要。
似乎您也混淆了命令替换$()和进程替换<()或>()。还<<<是重定向内容作为标准输入而<重定向文件。
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |