Linux 将文件名插入csv文件的最后一列。

Linux 将文件名插入csv文件的最后一列。,linux,bash,csv,Linux,Bash,Csv,我想将CSV文件的文件名插入CSV文件的最后一列 我找到了一个成功的windows批处理文件,但我正在寻找一个linux bash脚本 我已附上windows批处理文件: @echo off setLocal EnableDelayedExpansion for /f "tokens=* delims= " %%c in ('dir/b/a-d *.csv') do ( set FN=%%~Nc set /a N=0 for /f "tokens=* delims= " %%a

我想将CSV文件的文件名插入CSV文件的最后一列

我找到了一个成功的windows批处理文件,但我正在寻找一个linux bash脚本

我已附上windows批处理文件:

@echo off
setLocal EnableDelayedExpansion

for /f "tokens=* delims= " %%c in ('dir/b/a-d *.csv') do (
  set FN=%%~Nc
  set /a N=0

  for /f "tokens=* delims= " %%a in (%%c) do (
    set /a N+=1
    if !N! equ 1 (
      echo %%a, id > !FN!.csv
    ) else (
      echo %%a, !FN! >> !FN!.csv
    )
  )
)
期待着解决这个问题

亨利很简单

import sys
import glob

for filename in glob.glob(sys.argv[1]):
    file = open(filename)
    data = [line.rstrip() + "," + filename for line in file]
    file.close()

    file = open(filename, "w")
    file.write("\n".join(data))
    file.close()
另存为“csvadd.py”。然后,此命令将文件名添加到最后一列(当然,替换test.csv):

编辑

更改代码后,它现在应该可以处理操作系统支持的所有内容(通配符等)。它现在还将直接将更改写回文件小心使用

简单

import sys
import glob

for filename in glob.glob(sys.argv[1]):
    file = open(filename)
    data = [line.rstrip() + "," + filename for line in file]
    file.close()

    file = open(filename, "w")
    file.write("\n".join(data))
    file.close()
另存为“csvadd.py”。然后,此命令将文件名添加到最后一列(当然,替换test.csv):

编辑

更改代码后,它现在应该可以处理操作系统支持的所有内容(通配符等)。它现在还将直接将更改写回文件小心使用(gnu)sed:

使用POSIX sed:

for file in *.csv; do
    if sed "s/$/,$file/" "$file" > /tmp/"${file}".tmp; then
        mv /tmp/"${file}.tmp" "$file"
    fi
done
使用(gnu)sed:

使用POSIX sed:

for file in *.csv; do
    if sed "s/$/,$file/" "$file" > /tmp/"${file}".tmp; then
        mv /tmp/"${file}.tmp" "$file"
    fi
done


非常感谢。我可以使用通配符输入吗?哎呀。在f的最后一列中,再次测试该行。我使用了命令“python csvadd.py test.csv\r$。gnu种子可以工作,但会将文件名添加到第二列数据中,覆盖原始数据。POSIX也会这样做。不过,这两个脚本都会添加正确的数据,但添加到错误的列。我们希望数据位于最后一列。我已经生成了数据。这两个都在文件夹中的amend all file中。第一个$应该通过在它前面放\来转义。@HenryLevine如果你的CSV文件有DOS结尾,在它们上面使用unix sed将在\r和\n之间插入新内容,这在终端上看起来会很奇怪(输出中写入\r之后的内容与上一个文本在同一行,似乎覆盖了它)。在修复文件之前,在该文件上使用dos2unix,或者在正则表达式中使用
\r$