Regex 如何替换包含“的文本序列”\";在文本文件中
这听起来可能是重复的,但我不能让它工作 考虑:Regex 如何替换包含“的文本序列”\";在文本文件中,regex,bash,csv,tr,Regex,Bash,Csv,Tr,这听起来可能是重复的,但我不能让它工作 考虑: _=空格 -=减号 particle_little.csv是以下格式的文件: waste line to be deleted __data__data__data _-data__data_-data __data_-data__data 我需要获得particle_std.csv中的标准csv格式,如下所示: data,data,data -data,data,-data data,-data,data 我正在尝试使用tail和tr进行转换
_=空格
-=减号
particle_little.csv
是以下格式的文件:
waste line to be deleted
__data__data__data
_-data__data_-data
__data_-data__data
我需要获得particle_std.csv
中的标准csv格式,如下所示:
data,data,data
-data,data,-data
data,-data,data
我正在尝试使用tail
和tr
进行转换,这里我拆分命令:
tail-n+2 particle\u little.csv
删除第一行|tr-s'
删除重复的空格|tr'/\b\n\b/''\n'
删除最开始的空格|tr'','
更改逗号的空格>particle_std.csv
将其放入输出文件最后,文件很大,所以几乎不可能在编辑器中打开(我知道可能有超级编辑器可以打开)您可能应该使用
sed
或awk
来实现以下目的:
sed -e 1d -e 's/^ *//' -e 's/ */,/g'
在Awk中执行此操作的一种方法是:
awk 'NR == 1 { next }
{ pad=""; for (i = 1; i <= NF; i++) { printf "%s%s", pad, $i; pad="," } print "" }'
开始块设置输出字段分隔符;分配$1=$1代码>强制Awk返工输出线;打印
打印它
我留下了第一个Awk版本,因为它显示了不止一种方法,在某些情况下,这样的方法是有用的。但是对于这个任务,第二个Awk版本更好——更简单、更紧凑(并且与’s同构)。我建议您使用Awk:
$ cat file
waste line to be deleted
data data data
-data data -data
data -data data
$ awk -v OFS=, '{ $1 = $1 } NR > 1' file
data,data,data
-data,data,-data
data,-data,data
该脚本将输出字段分隔符OFS
设置为,
,并将第一个字段重新分配给自身$1=$1
,使awk接触每一行(并用逗号替换空格)。打印第一行之后的行,其中NR>1
(默认操作是打印该行)。因此,如果我读对了,请忽略不以空格开头的行。把其他的都分开
我建议perl
:
perl -lane 'next unless /^\s/; print join ",", @F';
这一点在给出时:
waste line to be deleted
data data data
-data data -data
data -data data
在STDIN
(或在文件名中指定)上,输出:
这是因为:
-l
剥离换行符(并在每次打印后替换换行符)
-a
在任何空格上自动分割
-n
将其包装在中,而(){/code>循环逐行迭代-从功能上讲,它的工作方式与sed
/grep
/tr
类似,并读取STDIN
或指定为args的文件
-e
允许指定perl代码段
在这种情况下:
- 跳过任何不以
\s
或任何空格开头的行
- 任何其他行,用
,
作为分隔符连接由-a
生成的字段(@F
)
然后,您可以将输出重定向到文件(>output.csv
)或者使用-i.bak
在原地编辑。在我看来,你试图使用错误的工具来完成这项工作;有趣的是,它工作得不太好。你是被迫只使用tr
和tail
?还是你只需要完成这项工作,而这些是第一批出现在手的工具?数据部分有没有是否包含空格?大概不是。我需要获得输出,是的,这些是我发现的第一批工具(因此,我对它们的用法很陌生)顺便说一句,这个文件很大。只要你不想一次把所有的文件都写到内存中,只要你不想写太多的管道,文件就不是问题。零管道最好;一个管道不是大问题;二十个管道可能是问题(它可能仍然是正确的,但通常不是)哦!老兄,这很神奇,同时也让我的解决方案变得有趣…谢谢,你能解释一下你使用的选项吗?我已经更新了我的答案来解释更多,还有什么不清楚的吗?
perl -lane 'next unless /^\s/; print join ",", @F';
waste line to be deleted
data data data
-data data -data
data -data data
data,data,data
-data,data,-data
data,-data,data