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

时间:2019-05-11 14:36:50

标签: unix cat

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

'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

2 个答案:

答案 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