#! /bin/bash
for (( l = 1 ; l <= 50; ++l )) ; do
for (( k = 1 ; k <= 1000; ++k )) ; do
sed -n '$l,$lp' $k.dat >> ~/Escritorio/$l.txt
done
done
该脚本位于一个文件夹中,其中包含 1000 个 dat 文件,每个文件有 50 行文本。
dat 文件名为1.dat
, 2.dat
,....,1000.dat
我的目的是创建文件l.txt
,其中l.txt
有 l 行1.dat
、l 行2.dat
等。为此,我使用sed
命令选择每个 dat 文件的 l 文件。
但是当我运行上面的脚本时,创建的txt里面什么都没有......
错误在哪里?
答案1
for LINE in {1..50}; do
for FILE in {1..1000}; do
sed -n "${LINE}p" "${FILE}.dat" >>"~/Escritorio/${LINE}.dat"
done
done
在您的脚本中,您对 sed 表达式使用单引号,变量不会在单引号内扩展,您需要使用双引号。
还有一个带有 awk 的单行代码可以做同样的事情:
awk 'FNR<=50 {filename=sprintf("results/%d.dat", FNR); print >> filename; close(filename)}' *.dat
只需创建结果目录,或在命令中将其更改为另一个目录,~
不会扩展到那里的主目录。
答案2
这个 awk 命令怎么样?尝试使用一小组 dat 文件
awk '{file=FNR".txt"; print $0 > file}' *.dat