使用文件-中的单词扩展文件名



我可以将文件的文件名更改为文件中的第一个单词。

for fname in lrccas1
do
cp $fname $(head -1 -q $fname|awk '{print $1}')
done

但我想把它扩展到插图中。

for fname in lrccas1
do
cp $fname $(head -1 -q $fname|awk '{print $1 FILENAME}')
done

我尝试过不同的变体,但似乎都不起作用。有简单的解决方案吗?

亲切问候Svend

首先,让我们了解为什么你没有得到想要的结果

head -1 -q $fname|awk '{print $1 FILENAME}'

您正在将head命令的标准输出重定向到awk命令,即awk正在读取标准输入,因此FILENAME设置为空字符串。当GNUAWK使用标准输入时询问FILENAME没有多大意义,因为只有数据通过管道传输,可能根本没有输入文件之类的东西,例如

seq 10 | awk '{print $1*10}'

其次,让我们找到获得所需结果的方法,您可以访问文件名和成功提取的单词,因此您可以将它们连接到

for fname in lrccas1
do
cp $fname "$(head -1 -q $fname|awk '{print $1}')$fname"
done

第三,我必须警告您,您的命令确实复制(cp(而不是重命名文件(rm(,并且不关心目标名称是否存在——如果存在,它将被覆盖。

您可以在纯bash(或sh(中进行

for fname in lrccas1
do
read -r word rest < "$fname" && cp "$fname" "$word$fname"
done

这将执行您的shell脚本试图执行的操作:

awk 'FNR==1{close(out); out=$1 FILENAME} {print > out}' lrccas1

但你可能想考虑这样的东西:

awk 'FNR==1{close(out); out=$1 FILENAME "_new"} {print > out}' *.txt

这样你新创建的文件就不会覆盖现有的文件,然后删除原始文件将是:

awk 'FNR==1{close(out); out=$1 FILENAME "_new"} {print > out}' *.txt &&
rm -f *.txt

这假设您的原始文件有一些后缀,如.txt或其他识别原始文件的方式,或者您将所有原始文件都放在某个目录中,如$HOME/old,并可以将新文件放在新目录中,例如$HOME/new:

cd "$HOME/old" &&
mkdir -p "$HOME/new" &&
awk -v newDir="$HOME/new" 'FNR==1{close(out); out=newDir "/" $1 FILENAME} {print > out}' * &&
echo rm -f *

在完成测试时移除echo,并对结果感到满意。

尝试执行以下操作:(bash(

for fname in file_name
do
cp $fname "$(head -1 -q $fname|awk '{print $1}')$fname"
done

最新更新