我想在文件行的开头合并文件名(一行)。
'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
答案 0 :(得分:1)
使用循环。遍历每个*.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
答案 1 :(得分:1)
只需使用grep -H
。发布更改定界符的过程:
$ 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, $0}' *.txt
f1.txt content1
f2.txt content2