连接多个文件但包含文件名作为节标题

时间:2011-05-06 21:55:43

标签: unix header terminal concatenation cat

我想将一些文本文件连接到终端中的一个大文件中。我知道我可以使用cat命令执行此操作。但是,我希望每个文件的文件名都在该文件的“数据转储”之前。有谁知道怎么做?

我现在拥有的东西:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

期望的输出:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow

20 个答案:

答案 0 :(得分:441)

正在寻找相同的东西,并发现这个建议:

tail -n +1 file1.txt file2.txt file3.txt

输出:

==> file1.txt <==
<contents of file1.txt>

==> file2.txt <==
<contents of file2.txt>

==> file3.txt <==
<contents of file3.txt>

如果只有一个文件,则不会打印标题。如果使用GNU utils,您可以使用-v始终打印标题。

答案 1 :(得分:170)

我使用grep做类似的事情:

grep "" *.txt

它没有给你一个'标题',但每行都有文件名前缀。

答案 2 :(得分:92)

这也可以解决问题:

find . -type f -print -exec cat {} \;

意思是:

find    = linux `find` command finds filenames, see `man find` for more info
.       = in current directory
-type f = only files, not directories
-print  = show found file
-exec   = additionally execute another linux command
cat     = linux `cat` command, see `man cat`, displays file contents
{}      = placeholder for the currently found filename
\;      = tell `find` command that it ends now here

您还可以通过-and-or等布尔运算符组合搜索。 find -ls也很好。

答案 3 :(得分:22)

这应该可以解决问题:

for filename in file1.txt file2.txt file3.txt; do
    echo "$filename"
    cat "$filename"
done > output.txt

或以递归方式对所有文本文件执行此操作:

find . -type f -name '*.txt' -print | while read filename; do
    echo "$filename"
    cat "$filename"
done > output.txt

答案 4 :(得分:15)

find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'

这将打印完整的文件名(包括路径),然后打印文件的内容。它也非常灵活,因为你可以使用-name“expr”作为find命令,并在文件上运行任意数量的命令。

答案 5 :(得分:15)

我有一系列以stats.txt结尾的文件,我想与文件名连接。

我做了以下操作,当有多个文件时,“more”命令包含文件名作为标题。

more *stats.txt > stats.txt

或一般情况

more FILES_TO_CONCAT > OUTPUT_FILE

答案 6 :(得分:4)

这就是我通常处理格式的方式:

for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;

我通常将猫送入grep以获取具体信息。

答案 7 :(得分:4)

我喜欢这个选项

for x in $(ls ./*.php); do echo $x; cat $x | grep -i 'menuItem'; done

输出如下:

./debug-things.php
./Facebook.Pixel.Code.php
./footer.trusted.seller.items.php
./GoogleAnalytics.php
./JivositeCode.php
./Live-Messenger.php
./mPopex.php
./NOTIFICATIONS-box.php
./reviewPopUp_Frame.php
            $('#top-nav-scroller-pos-<?=$active**MenuItem**;?>').addClass('active');
            gotTo**MenuItem**();
./Reviews-Frames-PopUps.php
./social.media.login.btns.php
./social-side-bar.php
./staticWalletsAlerst.php
./tmp-fix.php
./top-nav-scroller.php
$active**MenuItem** = '0';
        $active**MenuItem** = '1';
        $active**MenuItem** = '2';
        $active**MenuItem** = '3';
./Waiting-Overlay.php
./Yandex.Metrika.php

答案 8 :(得分:3)

你可以使用这个简单的命令而不是使用for循环,

ls -ltr | awk '{print $9}' | xargs head

答案 9 :(得分:2)

这是一个非常简单的方法。你说你想要猫,这意味着你想要查看整个文件。但是你还需要打印文件名。

试试这个

head -n99999999 *head -n99999999 file1.txt file2.txt file3.txt

希望有所帮助

答案 10 :(得分:2)

如果你喜欢颜色,试试这个:

for i in *; do echo; echo $'\e[33;1m'$i$'\e[0m'; cat $i; done | less -R

或:

tail -n +1 * | grep -e $ -e '==.*'

或:(已安装包'multitail')

multitail *

答案 11 :(得分:1)

此方法将打印文件名,然后打印文件内容:

tail -f file1.txt file2.txt

输出:

==> file1.txt <==
contents of file1.txt ...
contents of file1.txt ...

==> file2.txt <==
contents of file2.txt ...
contents of file2.txt ...

答案 12 :(得分:1)

如果您想用其他东西代替那些丑陋的==> <==

tail -n +1 *.txt | sed -e 's/==>/\n###/g' -e 's/<==/###/g' >> "files.txt"

说明:

tail -n +1 *.txt-输出带有标题的文件夹中的所有文件

sed -e 's/==>/\n###/g' -e 's/<==/###/g'-用换行 + ### ==>仅用### <== >

>> "files.txt"-全部输出到文件

答案 13 :(得分:0)

find . -type f -exec cat {} \; -print

答案 14 :(得分:0)

缺少的awk解决方案是:

$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *

答案 15 :(得分:0)

如果文件的名称相同或可以由find匹配,则可以执行以下操作:

find . -name create.sh | xargs tail -n +1

查找,显示文件的路径并管理每个文件。

答案 16 :(得分:0)

为了解决这个问题,我通常使用以下命令:

$ cat file{1..3}.txt >> result.txt

如果文件数量非常大,这是连接文件的一种非常方便的方法。

答案 17 :(得分:0)

  • AIX 7.1 ksh

...向那些已经提到过 head 的人提出了一些建议:

$ r head
head file*.txt
==> file1.txt <==
xxx
111

==> file2.txt <==
yyy
222
nyuk nyuk nyuk

==> file3.txt <==
zzz
$

我需要阅读第一行;如上所述,如果你想要超过10行,你必须添加选项(头-9999等)。

很抱歉发布衍生评论;我没有足够的街头信誉评论/添加某人的评论。

答案 18 :(得分:0)

如果您希望结果采用与所需输出相同的格式,可以尝试:

for file in `ls file{1..3}.txt`; \
do echo $file | cut -d '.' -f 1; \ 
cat $file  ; done;

结果:

file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow

您可以在剪切前后放置echo -e,以便在线条之间留出间距:

$ for file in `ls file{1..3}.txt`; do echo $file | cut -d '.' -f 1; echo -e; cat $file; echo -e  ; done;

结果:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow

答案 19 :(得分:-1)

首先,我创建了每个文件:为每个文件[123] .txt回显'信息'> file1.txt。

然后我打印每个文件以确保信息正确: 尾文件?.txt

然后我这样做:tail file?.txt >> Mainfile.txt。这样就创建了Mainfile.txt,将每个文件中的信息存储到一个主文件中。

cat Mainfile.txt确认还可以。

==> file1.txt <== bluemoongoodbeer

==> file2.txt <== 真棒

==> file3.txt <== hownowbrowncow