Unix - 如何将内容中的文件名与 cat 和基线合并?

Unix - how to merge filename inside content with cat and baseline?

我想合并文件(一行),文件名在行的开头。

'cat' 对文件进行合并,'basename -a' 给出文件名,但我不知道如何同时获得两者?

$ echo "content1" > f1.txt
$ echo "content2" > f2.txt
$ cat f*.txt > all.txt

$ cat all.txt
content1
content2

$ basename -a f*.txt
f1.txt
f2.txt

Would like this result :
$ cat all.txt
f1.txt  content1
f2.txt  content2

使用循环。遍历每个 *.txt 文件,将其名称回显到没有换行符的输出文件(用 echo -n 完成),将其内容附加到输出文件,最后附加一个换行符。请注意 >> 追加。使用 > 会覆盖。

rm -f all.txt
for f in *.txt; do echo -n "$f " >> all.txt; cat "$f" >> all.txt; echo >> all.txt; done

如果您的输入文件末尾已经包含一个换行符,那么您可以跳过最后的 echo 并执行:

for f in *.txt; do echo -n "$f " >> all.txt; cat "$f" >> all.txt; done

如果您使用的是 tcsh 而不是 bash,那么您可以使用 foreach,但是您不能在一个命令中编写整个循环。通常你会在脚本中写这个:

foreach f (*.txt)
    echo -n "$f " >> all.txt
    cat "$f" >> all.txt
end

要在单个命令行中获得此功能,您需要这样的东西:

printf 'foreach f (*.txt)\n echo -n "$f " >> all.txt\n cat "$f" >> all.txt\n end' | tcsh

只需使用grep -H。 Post 更改分隔符的过程:

$ for i in 1 2; do echo content$i > f$i.txt; done
$ grep -H . *.txt 
f1.txt:content1
f2.txt:content2
$ grep -H . *.txt  | sed 's/:/  /'
f1.txt  content1
f2.txt  content2

或者,

$ awk '{printf "%s\t%s\n", FILENAME, [=11=]}' *.txt
f1.txt  content1
f2.txt  content2