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

how to replace the spaces with ~ between specific position in every line of a file

我有一个要求,文件中的记录是“|”管道分隔。 字段4至字段20各20个字符。这些字段可能有前导和尾随 space,或者整个字段只能有 space。我只想将字段 4 的管道符号的开头和结尾处的 space 替换为字段 20。

我该怎么做?

样本记录:

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

请注意,仅当开头和结尾为 space 时才应进行替换,否则不得替换。

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

可读性

检查文件的开头和结尾是否有space,然后相应地替换

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