将 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单引号。