在Redhat中,我的file.csv包含以下数据:
170033101;20170302;;;"Free text 1"
170033101;20170302;;;"Free text 2"
170033101;20170302;;;"Free
text 3"
170033101;20170302;;;"Free text 4"
我想在从文件中删除错误的\ n之后创建另一个更正的文件(Correct_file.csv),如下所示:
170033101;20170302;;;"Free text 1"
170033101;20170302;;;"Free text 2"
170033101;20170302;;;"Free text 3"
170033101;20170302;;;"Free text 4"
我的解决方案:
我创建了下面的shell脚本来查找那些不以170开头的行之前的行,然后创建sed.txt,每个错误的行都有一个sed行以用空格替换\ n。
我无法执行sed命令或tr命令来删除基于行号的特定行
我的剧本:
>sed.txt;
for i in `grep -nv '^[1706]' $1|cut -f 1 -d \:`
do
if [ $i -eq 1 ]
then
continue
else
j=`expr $i - 1`
echo $j"s/\n//" >>sed.txt
fi
done
sed -f sed.txt $1 >$2
我调用脚本并传递2个参数1-旧文件2-新校正文件,新文件与旧文件完全没有校正。
答案 0 :(得分:1)
如果行以awk
结尾,您可以使用此"
命令根据事实工作:
awk '!/"$/{p=$0; next} p!=""{$0 = p $0; p=""} 1' file
170033101;20170302;;;"Free text 1"
170033101;20170302;;;"Free text 2"
170033101;20170302;;;"Free text 3"
170033101;20170302;;;"Free text 4"
答案 1 :(得分:0)
sed
会返回新字符串,因此您不需要echo
它。只需将其称为sed .. >> data.txt
以下sed语句将替换行末尾的新行。您只需要传递要翻译的行
sed ':a;N;$!ba;s/\n//g' <LINE INPUT>
如果您传递一个文件,它将循环读取整个文件,并用空格替换换行符。
答案 2 :(得分:0)
您可以使用此sed
:
sed '/^170/{:loop; N;/\n170/{P;D;t}; s/\n//g;b loop}' file
输入:
$ cat file
170033101;20170302;;;"Free text 1"
170033101;20170302;;;"Free text 2"
170033101;20170302;;;"Free
text 3"
170033101;20170302;;;"Free
text
4"
测试:
$ sed '/^170/{:loop; N;/\n170/{P;D;t}; s/\n//g;b loop}' file > correct_file.csv
170033101;20170302;;;"Free text 1"
170033101;20170302;;;"Free text 2"
170033101;20170302;;;"Free text 3"
170033101;20170302;;;"Free text 4"
答案 3 :(得分:0)
当我想与\n
合作时,我更喜欢简单的perl而不是sed:
$ cat file1
170033101;20170302;;;"Free text 1"
170033101;20170302;;;"Free text 2"
170033101;20170302;;;"Free
text 3"
170033101;20170302;;;"Free text 4"
$ perl -pe 's/[^"]\n/ /g' file1
170033101;20170302;;;"Free text 1"
170033101;20170302;;;"Free text 2"
170033101;20170302;;;"Free text 3"
170033101;20170302;;;"Free text 4"
此perl oneliner替换为每个新行\n
后面没有引号"
PS:您可以在命令末尾添加>newfile
以发送&#34;更正&#34;输出到newfile
,或者您甚至可以使用-i
perl开关编辑当前文件。
答案 4 :(得分:0)
尝试一次跟随awk。
awk '{printf("%s%s",$0 !~ /^[0-9]+/?"":(NR>1?RS:""),$0)} END{print ""}' Input_file
检查这里是否有任何行,如果没有从数字开始然后通过RS(记录分隔符)在那里打印新行,确保它不应该在第一行发生,否则什么都不打印。在awk打印的END部分为NULL,最后会打印一个新行。