我得到了一个命令的输出,它类似于2048,4096,8192,16384,24576,32768
。
我想把它分成6个不同的文件,但只有数字,而不是逗号初始文本:2048,4096,8192,16384,24576,32768
分为:2048
到文件A,4096
到文件B,8192
到文件C等等
该输出遵循以下规则:
- 总是有6个空格,用逗号分隔
- 数字的长度总是从3到5(我不知道正确的英语单词)
- 正如我告诉你的,逗号对我不感兴趣,因为我要用这些数字做数学运算
我试图删除最后的X个数字,但没有找到"检测"逗号的方法,所以操作可以停止。是否可以使用SED?
以下要求在上没有符合POSIX的shell外部的命令(例如您最有可能在Android上使用的busybox ash):
csv=/system/file.csv
IFS=, read a b c d e f <"$csv"
echo "$a" >A
echo "$b" >B
echo "$c" >C
echo "$d" >D
echo "$e" >E
echo "$f" >F
此确实假设要写入的文件(A
、B
、C
、D
、E
和F
)都在当前工作目录内。如果您想在其他地方编写它们,请修改它们的名称,或者使用cd
更改到其他目录。
我不确定sed是否是合适的工具。
使用一个简单的Bash脚本:
IFS=',' read -ra val < file.csv
for i in "${val[@]}"; do
echo $i > file$(( ++j ))
done
它将csv的每个值写入file1
、file2
等:
read
命令将file.csv
中的值分配给数组变量val
。使用循环,将每个值写入文件。
只需确保您在当前目录中具有写入权限。如果没有,请更改重定向(例如:> /dirWithWritePermissions/
)。
这可能适用于您(GNU sed、bash和并行):
parallel --xapply echo {1} ">>" part{2} :::: <(sed 's/,/n/g' file.csv) ::: {1..6}
这将两个文件"压缩"在一起,必要时重用较短的文件。
注意:在应用此命令之前,请记住删除任何part*
文件,否则这些文件将增长(>>
会追加)。
declare list_of_files=(fileA fileB fileC fileD fileE)
readarray a <<< $(sed 's/,/n/;{;P;D;}' <<< '2048,4096,8192,16384,24576,32768')
for i in ${a}; do
echo $i > "${list_of_files["$((num++))"]}"
done
说明:
s/,/n/
用换行符替换每个逗号{
启动命令组P
打印模式缓冲区中直到第一个换行符的所有内容D
检测模式缓冲区中直到第一个换行符的所有内容,然后重新启动当前命令组}
结束命令组
编辑:假设您想将信息复制到/system/file
中,但希望每个数字都在自己的行中:
$ sed 's/,/n/;{;P;D;}' < /sys/module/lowmemorykiller/parameters/minfree > /system/file
这将创建一个新的文件/system/file
,该文件将包含格式化的输出。
EDIT:更短的是:sed 's/,/n/g'
,它只需将每个逗号替换为一个新的空格(由末尾的g完成)。
还要注意,虽然sed
是一个很好用的工具(你一定喜欢它令人困惑的语言和命令…),但更好更快的方法是使用read
中内置的bash。