web-dev-qa-db-ja.com

複数のファイルを連結しますが、セクションヘッダとしてfilenameを含みます

ターミナルでいくつかのテキストファイルを1つの大きなファイルに連結したいです。私はこれをcatコマンドを使って実行できることを知っています。ただし、各ファイルのファイル名をそのファイルの「データダンプ」の前に置きます。誰もがこれを行う方法を知っていますか?

私が現在持っているもの:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

望ましい出力:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
309
Nick

同じことを探していて、これが示唆することがわかりました:

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>

ファイルが1つしかない場合、ヘッダーは印刷されません。 GNU utilsを使用している場合は、常にヘッダーを表示するために-vを使用できます。

445
DS.

私は似たようなものにgrepを使った。

grep "" *.txt

それはあなたに「ヘッダ」を与えるのではなく、ファイル名をすべての行に付けます。

170
Theo

これはトリックをするべきです:

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もいいですね。

94
Maxim_united

これでうまくいくはずです。

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
22
Chris Eberle
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'

これは完全なファイル名(パスを含む)を表示してからファイルの内容を表示します。 findコマンドに-name "expr"を使用し、ファイルに対して好きなだけコマンドを実行できるので、非常に柔軟です。

15
kevinf

Stats.txtで終わる一連のファイルがあり、それらをファイル名と連結したいと思いました。

私は以下をしました、そして、複数のファイルがあるとき、 "more"コマンドはファイル名をヘッダとして含みます。

more *stats.txt > stats.txt

または一般的な場合

more FILES_TO_CONCAT > OUTPUT_FILE
15
Steinfadt

これは私が通常そのようなフォーマットを扱う方法です:

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

私は一般的に特定の情報を得るために猫をgrepに送ります。

4
MorpheousMarty

私はこのオプションが好きです

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
4
ch3ll0v3k

forループを使う代わりに、この単純なコマンドを使うことができます。

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

色が好きなら、これを試してみてください。

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 *
2
sjas

これは本当に簡単な方法です。あなたは猫を飼いたいと言った、それはあなたがファイル全体を見たいと思うことを意味する。しかし、ファイル名も印刷する必要があります。

これを試して

head -n99999999 *またはhead -n99999999 file1.txt file2.txt file3.txt

それが役立つことを願っています

2
Trey Brister

あなたがこれらの醜い==> <==を何か他のものに置き換えたい場合

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" - すべてをファイルに出力

1
boroboris

このメソッドはファイル名を出力してからファイルの内容を出力します。

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 ...
1
serenesat
find . -type f -exec cat {} \; -print
0
user5689319

ファイルの名前がす​​べて同じであるか、findと一致する場合は、次のようにします。

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

検索するには、各ファイルのパスとcatを表示します。

0
drkvogel

結果を希望の出力と同じ形式にしたい場合は、次の方法を試してください。

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
0
Fekete Sumér

このタスクを解決するために、私は通常以下のコマンドを使います。

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

ファイル数が非常に多い場合は、ファイルを連結するのに非常に便利な方法です。

0
Igor

そして欠けているawkの解決策は:

$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *
0
kvantour
  • 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行以上が必要な場合は、オプションを追加する必要があります(head -9999など)。

派生的なコメントを投稿して申し訳ありません。コメントしたり、他の人のコメントに追加するのに十分なストリートクレジットがありません。

0
JustinKaisse