我有一个包含 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