【问题标题】:Estimate number of lines in a file and insert that value as first line估计文件中的行数并将该值作为第一行插入
【发布时间】:2020-10-03 08:04:36
【问题描述】:

我有许多文件,我必须估计每个文件中的行数并将该值添加为第一行。为了估计,我使用了这样的东西:

          wc -l 000600.txt | awk '{ print $1 }'

但是,如何对所有文件执行此操作,然后将每个文件对应的值添加为第一行,但没有成功。

一个例子: a.txt b.txt c.txt

 >>print a
   15

 >> print b
   22

 >>print c
   56

那么15、22、56应该分别加到:a.txt b.txt和c.txt

感谢您的帮助。

【问题讨论】:

  • 当你说“估计”时,我认为你真正的意思是“计算”。

标签: bash shell wc


【解决方案1】:

您可以在文件的第一行添加一个模式,例如 (LINENUM),然后使用以下脚本。

 wc -l a.txt  | awk 'BEGIN {FS =" ";} { print $1;}' | xargs -I {} sed -i 's/LINENUM/LINENUM:{}/' a.txt

或者只使用这个脚本:

wc -l a.txt  | awk 'BEGIN {FS =" ";} { print $1;}' | xargs -I {} sed -i '1s/^/LINENUM:{}\n/' a.txt

【讨论】:

  • 法哈德,谢谢,第二个选择效果很好。现在,我需要 for 循环或类似的方法将其应用于所有文件,而不仅仅是每个文件 a.txt
  • 在for循环中调用脚本很简单。我添加另一个答案。
  • BEGIN {FS =" ";} 正在将 FS 设置为它已经拥有的默认值,因此没有任何用处。如果 LINENUM 已经存在于文件中的其他位置并且根本没有必要,则 sed 脚本将失败。
【解决方案2】:

这样您可以将行号添加为当前目录中所有*.txt 文件的第一行。在大文件的情况下,在这里使用该组命令也会比就地编辑命令更快。不要在分组中修改空格或分号。

for f in *.txt; do
    { wc -l < "$f"; cat "$f"; } > "${f}.tmp" && mv "${f}.tmp" "$f"
done

【讨论】:

    【解决方案3】:

    要遍历所有文件,您可以从此脚本中添加使用。

     for f in `ls *` ; do if [ -f $f ];  then wc -l $f  | awk 'BEGIN {FS =" ";} { print $1;}' | xargs -I {} sed -i '1s/^/LINENUM:{}\n/' $f ; fi;  done
    

    【讨论】:

    【解决方案4】:

    这可能对你有用(GNU sed):

    sed -i '1h;1!H;$!d;=;x' file1 file2 file3 etc ...
    

    将每个文件存储在内存中,并插入最后一行行号作为文件大小。

    替代方案:

    sed -i ':a;$!{N;ba};=' file?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多