在不覆盖的情况下循环不断地粘贴到文件

2022-01-27 09:35:27 标签 linuxbashpaste

我想把一个输出文件从循环的一边粘贴到另一边,从循环生成的每个文件,而不覆盖文件。

如果它只是附加它可以用>>但我很难找到一种方法,我可以继续添加到一个文件,使列并排

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

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码