使用bash脚本批量折叠文本文件


2

我很难做一些简单的事情。我大约有2000个.txt文件,这些文件由单行数字组成。我想使用fold命令将单行折叠为多行的一列,并使用此新的折叠版本覆盖原始文件。我的尝试:

#!/bin/bash
for i in *.txt ; do
  fold -w 1 $file > $file
done

不起作用 救命?谢谢。


为了避免需要直接处理和清理临时文件,看到spongemoreutils包装,在文件的“就地”编辑
Peter.O

Answers:


5

这里有两个问题。首先,您要声明变量“ i”,但使用不存在的“ $ file”。即使这样做,第二个问题是bash读取“从左到右”。这意味着它将首先看到“> $ file”,并将覆盖文件的内容。因此,如果使用正确的变量,则可能会丢失数据。

因此,一个错误使您免于另一个错误,您是幸运的,幸运的家伙:)

尝试类似的方法:

for i in *.txt ; do fold -w 1 $i > sillytmpfile; mv sillytmpfile $i; done

在我的辩护中,我患有甲型流感。会努力的。只是出于好奇。我有18GB的txt文件。有没有临时文件的任何方法吗?谢谢。
弗兰克·扎夫卡

1
@RSoul tmpfile为每个文件创建一次,并立即删除,不会给您带来任何问题。没有tmp文件的唯一方法是将折叠后的输出重定向到另一个文件:for i in *.txt ; do fold -w 1 $i > $i".folded"; done。但是,那会使文件数量增加一倍,因此我不建议这样做。
terdon 2012年

好的。学习曲线的所有部分。:)
弗兰克·扎夫卡

如果选择sillytmpfile要在ramdisk上的路径,则可以对其进行优化。在Linux上,这通常是/tmp/run/shm也许其他人,请与mount | grep tmpfs
雷神

2

sed 也可能是一个选项,它在内部处理临时文件问题:

for i in *.txt ; do
  sed  -i 's#.#&\n#g' $file
done

有趣。我将有一天去了解sed。;)
Frank Zafka 2012年

仍然会创建一个tmp文件。我的猜测是,由于它需要一个正则表达式进行评估并会在整行中搜索,因此它会花费更长的时间。

1
是的,它肯定慢一些,请同时使用... foldsed... time printf '%sabcdef\n' {1..1000000} |fold -w 1 >/dev/null…… 由于原始换行符的处理方式,输出也有所不同
Peter.O 2012年

@PeterO:根据我的测量,速度要慢大约6倍,但输出没有任何差异。
雷神

也许是版本问题。这是我的命令和wc行计数结果:... fold (GNU coreutils)7.4 printf '%sabcdef\n' {1..1000000} |fold -w 1 |wc -l # -> 11888896 ... GNU sed 版本4.2.1 printf '%sabcdef\n' {1..1000000} |sed 's#.#&\n#g' |wc -l # -> 12888896
Peter.O 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.