我的样本文件是可变长度的,没有任何字段定界符。行的最小长度为18个字符,并且第11至15列之间可能(并非总是)存在“ CRLF”。仅当中间有换行符('CRLF')(第11-15列)时,才如何用空格替换。我仍然想保留真实的记录。 样本数据:
输入:
1123xxsdfdsfsfdsfdssa
1234ddfxxyff
frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm
knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
预期输出:
1123xxsdfdsfsfdsfdssa
1234ddfxxyfff rrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
我尝试过的事情:
sed '/^.\{15\}$/!N;s/./ /11' filename
但是上面的代码只是增加空间,而不是删除'CRLF'
答案 0 :(得分:0)
给出您的样本数据,这似乎会产生所需的输出:
$ awk 'length($0) < 18 { getline x; $0 = $0 " " x} { print }' data
1123xxsdfdsfsfdsfdssa
1234ddfxxyff frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$
但是,如果输入包含CRLF行结尾,事情就不会那么高兴;最好一并过滤掉CR字符(Unix文件通常不包含CR,当然也通常不包含CRLF行尾)。
$ tr -d '\r' < data | awk 'length($0) < 18 { getline x; $0 = $0 " " x} { print }'
1123xxsdfdsfsfdsfdssa
1234ddfxxyff frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$
如果您确实需要DOS风格的CRLF输入和输出,则可能需要使用utod
或unix2dos
之类的程序(或其他类似工具)将Unix行尾转换为DOS。