2015-10-15 55 views
1

我有行了指定的字符數的後一排DataFile.txt多行這樣定界符在文本的使用bash

01025550006001U00000000001721SMITH JOHN 
536818991298231894872315612145497F00000000001721STUART FEDERIC 

在一行中的每個字符表示一些(位置),和需要根據每行中的字符位置添加分隔符(空格)。例如:

  • 情況1:字符#2
  • 情況2:字符#10
  • 情況3:字符#26
  • 情況4:字符#44
  • 案例5:字符#48

...等等

然後輸出這個規則和NewFile.txt :

01 02555000 6001U0000000000 1721 SMITH JOHN 
53 68189912 9823189487231561 2145497F0000000000 1721 STUART FEDERIC 

回答

3

您可以在gnu-awkFIELDWIDTHS

awk 'BEGIN{FIELDWIDTHS = "2 8 16 18 4 100"; OFS=" "} 
    {$1=$1; print}' DataFile.txt 

你使用,

 
01 02555000 6001U0000000000 1721 SMITH JOHN 
53 68189912 9823189487231561 2145497F0000000000 1721 STUART FEDERIC 
+1

可以golfed爲'gawk的-v FIELDWIDTHS =」 2 8 16 18 4 99「'{$ 1 = $ 1} 1'' –

+0

謝謝! @glennjackman是另一種方式,它們都是非常有用的方式來做文件中的更改。 – Matias

3

我會說:

sed -E 's/(.{2})(.{8})(.{16})(.{18})(.{4})/\1 \2 \3 \4 \5 /' filename 

很老的GNU SEDS,您可能需要使用-r而不是-E(這是擴展的正則表達式的語法。沒有這些,你需要大量的反斜槓,這些反斜槓不完全有助於可讀性)。

這只是捕獲字母組合 - .{n}匹配n個任意字母 - 並重新組合它們並添加空格。

附錄:

如果重要的是,所用的數字是一樣的問題,考慮的Perl:

perl -pe 'for $i (48, 44, 26, 10, 2) { substr($_, $i, 0) = " "; }' filename 

...因爲更換零長度字符串是相同的作爲插入。數字必須下降才能工作,以便已插入的空格不會混淆計數。

請注意,這可能會提供比sed方法更差的性能(因爲需要計算更多的中間字符串),根據文件大小,這可能是也可能不是問題。但是,如果性能不是一個考慮因素,並且您更喜歡使用絕對位置來處理字段寬度,則可以使用。

+0

感謝您的幫助,但我會更喜歡AWK方式 – Matias