【问题标题】:Appending file_name part to each line of the file, recursively to multiple files将 file_name 部分附加到文件的每一行,递归地附加到多个文件
【发布时间】:2019-02-09 06:05:33
【问题描述】:

所以,我有多个表单文件

filename_date.csv

在文件夹中,例如

filename_2010_01_01.csv

该文件包含,例如... 1000 行,格式如下

37845287|2364532467|237849853
04568750|89345735385|94573857

但我全年有 365 个这样的文件,每天一个。我想做的是制作某种bash?脚本可能会从文件名中获取日期并将其附加到每个文件中每个 x 行的末尾,因此结果将类似于

文件名_2010_01_01.csv

37845287|2364532467|237849853|2010_01_01
04568750|89345735385|94573857|2010_01_01

文件名_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

【问题讨论】:

  • 努力添加到问题中
  • 我看到了,我现在正在写入一个新文件...但是 var 插值有问题。你能看看更新3吗?

标签: bash terminal file-manipulation


【解决方案1】:

您正在覆盖您正在阅读的同一个文件。一旦 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

【讨论】:

  • 如果有问题,请告诉我,这样我可以重写答案,使其对其他人有效
  • -i 参数给了我一个类似“p 命令后的字符”的错误。这条线对我有用sed "s/$/|$fname/" filename_${fname}.csv > $fname.csv
  • 很奇怪。 -i 只是意味着在适当的位置编辑文件。而且任何地方都没有p 命令:-?
  • 是的。我在代码中搜索 p 也没有找到任何东西。也许$ 在你的答案和我的答案中转义而不转义?
猜你喜欢
  • 2020-03-19
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2011-12-06
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多