我的目录中有 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
(添加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