我想把一个输出文件从循环的一边粘贴到另一边,从循环生成的每个文件,而不覆盖文件。
如果它只是附加它可以用>>但我很难找到一种方法,我可以继续添加到一个文件,使列并排
cat a.txt >> final.txt
我的文件是那种格式的
File 1 file 2
123 108
176 193
123 145
我想把这些粘在一起
paste -d ' ' file1.txt file2.txt > final.txt
然后,我想继续通过循环迭代向文件final添加内容
paste -d ' ' file3.txt final.txt >>final.txt
输出我想,然后将有3列-即file3。txt不追加到底部,从而增加行,但添加到一边,像在正常的粘贴,所以列没有增加与每个段落
123 108 125
176 193 478
123 145 645
任何帮助都将不胜感激
###通常情况下,你可以像这样追加到一个文件:
cat a.txt &>> final.txt
但如果你想获得列,你应该使用粘贴,例如创建。csv文件:
paste -d , final.csv a.csv
。txt文件不是保存列的通常格式,因此应该考虑。csv格式。
###不清楚你为什么要这样做,而不是在所有处理结束时创建一个输出文件,但假设它是有用的:
seq 2 > file
for i in {1..3}; do
seq 2 > tmp1 &&
paste file tmp1 > tmp2 &&
mv tmp2 file
echo "-----"
cat file
done
-----
1 1
2 2
-----
1 1 1
2 2 2
-----
1 1 1 1
2 2 2 2
# # # < blockquote >
努力找到一种方法,我可以不断添加到一个文件,使列并排
你必须使用一个临时文件。(或者你也可以使用海绵。)
paste -d ' ' file3.txt final.txt >> final.txt.temp
mv final.txt.temp final.txt
currently I paste the XXthousand at the end using for f in *${chr}3.txt; do cat final ${chr}.txt | paste -d ' ' - $f >temp; cp temp final ${chr}.txt; done;
只运行一次。
paste -d ' ' *_${chr}_3.txt > final_${chr}.txt
###绝对最简单和最有效的解决方案是简单地运行paste
once with all your input files as arguments.
根据你在评论中所说的,你似乎只是在寻找
paste -d ' ' *_"${chr}_3.txt" >"final_${chr}.txt"
如果以不同的顺序获取文件很重要,请尝试先组织参数粘贴,也许可以使用数组。下面是文件的倒序:
files=( *_"${chr}_3.txt" )
reversed=( )
for((i=${#files[@]}; i>0; i--)); do
reversed+=("${files[i]}")
done
paste -d ' ' "${reversed[@]}" >"final_${chr}.txt"
数组是仅限bash的特性(尽管也可以移植到ksh,或多或少也可以移植到Zsh);上面的早期解决方案可移植到任何Bourne shell。这个for循环语法也是一个Bash扩展。
如果你有很多文件或者你的文件名很长,你可能会遇到“参数列表太长”的错误。解决这个问题的方法是使用xargs,不过要适应这种场景可能有点棘手。也许还可以看看GNU并行,它有一些特性来简化这种场景。作为替代,这里有一个简单的递归函数,它避免了任何显式的临时文件。
ppaste () {
case $# in
1|2) paste -d ' ' "$@";;
*) local first=$1
shift
paste -d ' ' "$first" <(ppaste "$@");;
esac
}
进程替换<(…)也是一个Bash特性,不能移植到POSIX sh。
演示:https://ideone。com/FEwKYo