将 file_name 部分附加到文件的每一行,递归到多个文件
Appending file_name part to each line of the file, recursively to multiple files
所以,我有多个格式的文件
filename_date.csv
在文件夹中,例如
filename_2010_01_01.csv
该文件包含,比方说... 1000 行,格式如下
37845287|2364532467|237849853
04568750|89345735385|94573857
但是我全年有365个这样的文件,每天一个。我想做的是做一些 bash?脚本可能从文件名中获取日期并将其附加到每个文件中每个 x 行的末尾,因此结果类似于
filename_2010_01_01.csv
37845287|2364532467|237849853|2010_01_01
04568750|89345735385|94573857|2010_01_01
filename_2010_01_02.csv
438574|563546567|2342523525|2010_01_02
326345452|456454763|7856763|2010_01_02
到目前为止我已经尝试过:
我试过这个
sed 's/$/|2010-01-01/' filename_2010-01-01.csv > filename_2010-01-01.csv
适用于单个文件。
现在我正在尝试以下循环
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
filename=$f | cut -d'/' -f7-
done
一旦我在那里有了文件名,我就可以在循环中添加 sed 命令,但是我在使 filename
var 获取命令值时遇到了麻烦
如果我只是在循环中回显命令,它确实会得到文件名,该命令只是从文件名中删除路径。
更新:
循环内部
filename=`basename $f`
更短、更清晰并且变量实际获得了值
更新 2:
这个循环
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
fname=`basename $f`
fname=${fname%.csv}
fname=${fname##filename_}
echo $fname
sed 's/$/|$fname/' filename_$fname.csv > filename__$fname.csv
done
实际上正确输出了日期,但是 sed 命令中有些东西删除了文件的内容
更新 3:
有了这个我就差不多了
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
fname=`basename $f`
fname=${fname%.csv}
fname=${fname##partitioned.csvmerged_}
sed 's/$/|$fname/' partitioned.csvmerged_${fname}.csv > $fname.csv
done
它写了一个新文件,只有日期作为文件名(这很好)但我不确定我应该如何在那里插入 var,因为文件中的输出是
438574|563546567|2342523525|$fname
326345452|456454763|7856763|$fname
您正在覆盖正在阅读的同一个文件。一旦 shell 解析命令,它就会开始截断文件,然后在准备好输出文件后,它会启动 sed
命令,找到一个空文件。您的问题将通过避免重定向并在 sed
:
中使用 -i
参数来解决
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
fname=$(basename "$f" .csv)
fname=${fname##filename_}
echo "$fname"
sed -i "s/$/|$fname/" "filename_$fname.csv"
done
我还添加了一些小改动,例如使用已经存在的 basename
来摆脱扩展名、引用变量并解决您的下一个问题:由于使用而没有扩展 $fname
单引号。
所以,我有多个格式的文件
filename_date.csv
在文件夹中,例如
filename_2010_01_01.csv
该文件包含,比方说... 1000 行,格式如下
37845287|2364532467|237849853
04568750|89345735385|94573857
但是我全年有365个这样的文件,每天一个。我想做的是做一些 bash?脚本可能从文件名中获取日期并将其附加到每个文件中每个 x 行的末尾,因此结果类似于
filename_2010_01_01.csv
37845287|2364532467|237849853|2010_01_01
04568750|89345735385|94573857|2010_01_01
filename_2010_01_02.csv
438574|563546567|2342523525|2010_01_02
326345452|456454763|7856763|2010_01_02
到目前为止我已经尝试过:
我试过这个
sed 's/$/|2010-01-01/' filename_2010-01-01.csv > filename_2010-01-01.csv
适用于单个文件。
现在我正在尝试以下循环
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
filename=$f | cut -d'/' -f7-
done
一旦我在那里有了文件名,我就可以在循环中添加 sed 命令,但是我在使 filename
var 获取命令值时遇到了麻烦
如果我只是在循环中回显命令,它确实会得到文件名,该命令只是从文件名中删除路径。
更新:
循环内部
filename=`basename $f`
更短、更清晰并且变量实际获得了值
更新 2:
这个循环
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
fname=`basename $f`
fname=${fname%.csv}
fname=${fname##filename_}
echo $fname
sed 's/$/|$fname/' filename_$fname.csv > filename__$fname.csv
done
实际上正确输出了日期,但是 sed 命令中有些东西删除了文件的内容
更新 3:
有了这个我就差不多了
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
fname=`basename $f`
fname=${fname%.csv}
fname=${fname##partitioned.csvmerged_}
sed 's/$/|$fname/' partitioned.csvmerged_${fname}.csv > $fname.csv
done
它写了一个新文件,只有日期作为文件名(这很好)但我不确定我应该如何在那里插入 var,因为文件中的输出是
438574|563546567|2342523525|$fname
326345452|456454763|7856763|$fname
您正在覆盖正在阅读的同一个文件。一旦 shell 解析命令,它就会开始截断文件,然后在准备好输出文件后,它会启动 sed
命令,找到一个空文件。您的问题将通过避免重定向并在 sed
:
-i
参数来解决
FILES=~/Desktop/2010/byday/*
for f in $FILES
do
fname=$(basename "$f" .csv)
fname=${fname##filename_}
echo "$fname"
sed -i "s/$/|$fname/" "filename_$fname.csv"
done
我还添加了一些小改动,例如使用已经存在的 basename
来摆脱扩展名、引用变量并解决您的下一个问题:由于使用而没有扩展 $fname
单引号。