ファイル内のすべての行/ディレクトリ内のすべてのファイルを収集する方法

ファイル内のすべての行/ディレクトリ内のすべてのファイルを収集する方法

私のディレクトリにテキスト行を含む100個のファイルがあります。ファイルのすべての行を1行にリンクしたいと思います。一度にすべてのファイルに対してこれを行いたいと思います。catここではうまくいかないようです。

はい

ファイル1

atagacat
agataga
ctcatctat
tagcatag

File_1_cat

atagacatagatagactcatctattagcatag

ファイル_2

atagacat
agataga
ctcatctat
tagcatag

file_2_cat

atagacatagatagactcatctattagcatag

答え1

シンプルcat+trで十分です。そうでない場合は、システムに問題がある可能性があります。

sh-4.2$ cat file1 file2 
atagacat 
agataga 
ctcatctat 
tagcatag 
atagacat 
agataga 
ctcatctat 
tagcatag
sh-4.2$ cat file1 file2 |tr -d '\n'
atagacatagatagactcatctattagcatagatagacatagatagactcatctattagcatag

ここでオンラインでテストしてください:http://www.tutorialspoint.com/execute_bash_online.php?PID=0Bw_CjBb95KQMdUM4UER3SzE5Sk0

修正する

各ファイルから新しい行を個別に削除し、すべてのファイルを一緒にリンクしないことをコメントで明確にした後(ps:コメントに有用な説明を追加しないでください。主な質問を編集してください)、次のものを使用できます。コンテンツ:

perl -pe 's/\n//g' file >file_cat #perl -pe is directly equivalent to `sed`.  

また、perl -peを使用してより多くのファイルを同時に一括交換することもできます。

perl -pe 's/\n//g' -i file{1..100) #-i : in-place replacements in each file
OR
perl -pe 's/\n//g' -i.bak file{1..100) #in-place replacement keeping also a backup of original file

ALSO this works for all txt files in a directory
perl -pe 's/\n//g' -i.bak *.txt #in line replacement of all txt files in current directory keeping also a back up file

もちろん、他の答えで言及されているループの1つを使用することも、次のように使用することもできます。

while IFS= -r -d '' fname;do 
  perl -pe 's/\n//g' "$fname" >"${fname}_cat"
  #any other command you might need like echo,cat,whatever
done < <(find . -maxdepth 1 -type f -name 'file*' -print0)

答え2

for name in ./*; do
  test -f "$name" && (tr -d '\n'; echo) <"$name" >"${name}_cat"
done

これにより、現在のディレクトリのすべての一般ファイルから(個別に)すべての改行文字が削除されます(これはまさにそれですtr -d '\n')。これにより、echo生成された各ファイルの行末に改行文字があります。

答え3

trこの目的には使用しないでください。tr -d '\n'削除みんな改行文字。改行文字のない空でないファイルはテキストファイルではありません。一連の文字を正しいテキスト行として扱うには、末尾に改行文字が必要です。

すべての行を1つにリンクする標準コマンドは、貼り付けコマンドです。

 for file in ./*; do paste -sd '\0' "$file" > "${file}_cat"; done

これにより、現在のディレクトリにある非表示のすべてのファイルに対してこれが行われます(通常、シンボリックリンク、ディレクトリなどの種類に関係なく)。外部シェルに非隠しファイルがない場合、エラーが発生し、空のzshファイルpaste*_cat生成されます。

また、file_cat開けられないファイルに対しては空のファイルを生成します。これらの問題の一部を回避するには、次のことをお勧めします。

for file in ./*; do
  [ ! -f "$file" ] || paste -sd '\0' - < "$file" > "${file}_cat"
done

代わりに(-f一般ファイルまたは一般ファイルへのシンボリックリンクのみを考慮)、または短いですが、より良いですzsh

file (./*(N-.)) do paste -sd '\0' - < $file > ${file}_cat

D隠しファイルを含めるには、glob修飾子を追加してください)。

-d '\0'ヌル区切り文字を指定する標準的な方法です。いいえNUL 文字区切り文字を表します。一部のpaste実装では-d ''移植性はありませんが、これをサポートしています(他のpaste実装では区​​切り文字の欠落について文句を言います)。

答え4

そしてawk

awk '{printf $0> (FILENAME"_cat")}' *

新しいファイルの末尾に改行文字が必要な場合:

awk '{printf $0> (FILENAME"_cat")}' *; sed -i -e '$a\' *_cat

関連情報