添加文件名作为列标题

添加文件名作为列标题

我有一个包含 txt 格式的表格的目录,我想将文件名添加为第二列的标题,例如:

文件_1.txt

row_1 1 
row_2 0 
row_3 1  
row_4 1 
row_5 1 
row_6 1

输出.txt

rows  file_1
row_1  1 
row_2  0 
row_3  1  
row_4  1 
row_5  1

我在想这样的事情

sed 1 's/top_row/$file_name/1' < "$file";

答案1

这会写出一行rows file_1.txt,然后输出整个文件:

 echo "rows $file"; cat "$file"

如果您想从输出中删除文件扩展名,如上面所示,请使用basename

 echo "rows $(basename $file .txt)"; cat "$file"

答案2

for file in ./file_*.txt
do
  awk 'NR==1 { print "rows", FILENAME }; 1' "$file" > temp && mv temp "$file"
done

-i或者,使用支持就地编辑的sed :

for file in ./file_*.txt
do
  sed -i "1i\
rows $file" "$file"
done

答案3

假设file_*.txt匹配您想要处理的所有文件,并且文件使用制表符作为分隔符:

tmpfile=$(mktemp)
for filename in file_*.txt; do
    { printf 'rows\t%s\n' "$filename"; cat "$filename"; } >$tmpfile &&
    mv "$tmpfile" "$filename"
done

这将迭代匹配的文件名,并且对于每个文件,将输出一行包含标头,后跟文件本身的内容到一个临时文件中,如果一切正常,则该临时文件将替换原始文件。

请注意,这会修改原始文件。在你的问题中,你给出了一个例子,并说这应该输出到output.txt,但不清楚在哪里写入所有其他文件的结果,所以我采用了这种方法。

答案4

一些难以理解的 perl,只是为了好玩

perl -i -pe '$.==1&&do{($f=$ARGV)=~s/\..*?$//;$_="rows $f\n$_"};close ARGV if eof' *.txt

相关内容