如何将文件中的所有行放在一起/目录中的所有文件

如何将文件中的所有行放在一起/目录中的所有文件

我的目录中有 100 个包含文本行的文件。我想将文件中的所有行连接成一行。我想一次性对所有文件执行此操作。cat似乎在这里不起作用

例子

文件_1

atagacat
agataga
ctcatctat
tagcatag

文件_1_猫

atagacatagatagactcatctattagcatag

文件_2

atagacat
agataga
ctcatctat
tagcatag

文件_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

您当然可以使用其他答案中提到的一种循环,或者像这样:

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'删除全部换行符。没有换行符的非空文件不是文本文件。您需要在末尾有一个换行符才能将一系列字符视为正确的文本行。

将所有行连接成一行的规范命令是粘贴命令:

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

这将为当前目录中的所有非隐藏文件(无论其类型如何——常规、符号链接、目录...)执行此操作。如果在 以外的 shell 中没有非隐藏文件,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

(添加Dglob 限定符以包含隐藏文件)。

-d '\0'是指定空分隔符的标准方法(它确实不是表示 NUL 字符分隔符)。一些paste实现-d ''也支持这一点,尽管这不可移植(其他paste实现会抱怨缺少分隔符)。

答案4

awk

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

如果您需要在新文件末尾换行:

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

相关内容