如何从文件[shell]中的某些特定行的末尾删除\ n?

时间:2017-08-21 14:18:01

标签: linux bash shell unix redhat

在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-新校正文件,新文件与旧文件完全没有校正。

5 个答案:

答案 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,最后会打印一个新行。