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
我想合并文件(一行),文件名在行的开头。
'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