如何在文件的每一行中的特定位置之间用〜替换空格

时间:2016-06-03 15:40:30

标签: unix sed text-processing

我有一个要求,即文件中的记录是“|”管道划界。 字段4到字段20各为20个字符。这些字段可能包含前导和尾随空格,或者整个字段只能是空格。我想将第4个字段的管道符号的开头和末尾的空格替换为字段20.

我该怎么做?

SAMPLE记录:

XXXX|XXXX| XXXXXX|05.00000% 02/01/2030|OXXXXXXX, TEST |XXXXXXW     |                    |                    |                    |                    |                    |                    |                    |                    |                    |                    |                    |                    |ORG |0001-01-01|10|14|XXX|2016-05-01|            |   |2016-10-14|0001-01-01|2030-02-01|2014-01-01|Y|2|000|1|I|            | | |N|SA          |N|2016-05-26|A|US|2016-05-01| |Y|N|08 |SDBM1       |Y|Y| |N| |N|N| |  |  | |  |R|            |            |N|            |            |0000000000000000.00|            |0000000000000000.0000|            |            |2|XXXXX|2014-10-06|AA   |2016-05-11|     |0001-01-01|     |0001-01-01|05.00000|2016-05-11|                                                                                                                                                      |C           |2010-09-10|0001-01-01|XXXX|     |2011-06-09|     |2011-06-09|2026-02-01|0000000100.000000000|P|          |0000000000.000000000|

预期输出:

....something.. |~  MAhesh   ~|~MAHESH  KMR|MKR   ~|.. till 20th field

请注意,只有在开头和结尾都是空格时才会发生替换,否则不能替换。

1 个答案:

答案 0 :(得分:0)

awk -F"|" 'BEGIN{OFS="|"}{for(i=4;i<=20;i++){$i = match($i,/^[[:space:]]/)? "~"substr($i,2): $i; $i = match($i,/[[:space:]]$/)? substr($i,1,19)"~":$i}} 1' < file

为了便于阅读

检查该字段是否在开始和结束时有空格,然后相应地替换

awk -F"|" '
BEGIN{OFS="|"}
{
 for(i=4;i<=20;i++){
    $i = match($i,/^[[:space:]]/) ? "~"substr($i,2): $i;
    $i = match($i,/[[:space:]]$/) ? substr($i,1,19)"~":$i
 }
} 1
' < file