私のディレクトリにテキスト行を含む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