ターミナルでいくつかのテキストファイルを1つの大きなファイルに連結したいです。私はこれをcatコマンドを使って実行できることを知っています。ただし、各ファイルのファイル名をそのファイルの「データダンプ」の前に置きます。誰もがこれを行う方法を知っていますか?
私が現在持っているもの:
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
望ましい出力:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
同じことを探していて、これが示唆することがわかりました:
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
を使用できます。
私は似たようなものにgrepを使った。
grep "" *.txt
それはあなたに「ヘッダ」を与えるのではなく、ファイル名をすべての行に付けます。
これはトリックをするべきです:
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
もいいですね。
これでうまくいくはずです。
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
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'
これは完全なファイル名(パスを含む)を表示してからファイルの内容を表示します。 findコマンドに-name "expr"を使用し、ファイルに対して好きなだけコマンドを実行できるので、非常に柔軟です。
Stats.txtで終わる一連のファイルがあり、それらをファイル名と連結したいと思いました。
私は以下をしました、そして、複数のファイルがあるとき、 "more"コマンドはファイル名をヘッダとして含みます。
more *stats.txt > stats.txt
または一般的な場合
more FILES_TO_CONCAT > OUTPUT_FILE
これは私が通常そのようなフォーマットを扱う方法です:
for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;
私は一般的に特定の情報を得るために猫をgrepに送ります。
私はこのオプションが好きです
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
forループを使う代わりに、この単純なコマンドを使うことができます。
ls -ltr | awk '{print $9}' | xargs head
色が好きなら、これを試してみてください。
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 *
これは本当に簡単な方法です。あなたは猫を飼いたいと言った、それはあなたがファイル全体を見たいと思うことを意味する。しかし、ファイル名も印刷する必要があります。
これを試して
head -n99999999 *
またはhead -n99999999 file1.txt file2.txt file3.txt
それが役立つことを願っています
あなたがこれらの醜い==> <==を何か他のものに置き換えたい場合
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"
- すべてをファイルに出力
このメソッドはファイル名を出力してからファイルの内容を出力します。
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 ...
find . -type f -exec cat {} \; -print
ファイルの名前がすべて同じであるか、find
と一致する場合は、次のようにします。
find . -name create.sh | xargs tail -n +1
検索するには、各ファイルのパスとcatを表示します。
結果を希望の出力と同じ形式にしたい場合は、次の方法を試してください。
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
このタスクを解決するために、私は通常以下のコマンドを使います。
$ cat file{1..3}.txt >> result.txt
ファイル数が非常に多い場合は、ファイルを連結するのに非常に便利な方法です。
そして欠けているawkの解決策は:
$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *
...既に言及した人たちにうっとりとしていますhead私たちの何人かに働きます
$ r head
head file*.txt
==> file1.txt <==
xxx
111
==> file2.txt <==
yyy
222
nyuk nyuk nyuk
==> file3.txt <==
zzz
$
私の必要性は最初の行を読むことです。すでに述べたように、10行以上が必要な場合は、オプションを追加する必要があります(head -9999など)。
派生的なコメントを投稿して申し訳ありません。コメントしたり、他の人のコメントに追加するのに十分なストリートクレジットがありません。