2013-08-26 27 views
0

我有一些如下所示的文件。如果該列爲空,我需要在第五列中添加一個字符「C」。我更喜歡就地編輯。如果該列爲空,請在列中添加字符C

1 87 E P    0 0 131  0, 0.0  0, 0.0  0, 0.0  0, 0.0 0.000 360.0 360.0 360.0 150.0 7.2 83.8 79.2 
2 88 E V  +  0 0 136  1,-0.1  2,-0.5  3,-0.0  0, 0.0 0.993 360.0 80.8 -61.8 -61.8 7.7 80.9 76.8 
3 89 E K S S+  0 0 195  2,-0.0  2,-0.3  0, 0.0 -1,-0.1 -0.222 77.4 108.3 -45.5 95.3 5.5 82.5 74.2 
4 90 E R S S-  0 0 153  -2,-0.5  2,-0.5  2,-0.0  0, 0.0 -0.864 72.2-119.8-173.3 140.8 8.2 84.8 72.9 
5 191 E R  -  0 0 202  -2,-0.3  2,-0.2  1,-0.0 -2,-0.0 -0.772 46.1-115.0 -83.4 130.6 10.4 85.4 70.0 
6 92 E L H  -  0 0 109  -2,-0.5  2,-0.5  1,-0.1 -1,-0.0 -0.499 24.5-142.8 -70.2 134.3 14.0 85.3 71.3 
7 93 E D  +  0 0 126  -2,-0.2 -1,-0.1  1,-0.1  0, 0.0 -0.852 36.1 149.0-101.0 126.6 15.9 88.6 71.1 
8 94 E L    0 0 140  -2,-0.5 -1,-0.1  0, 0.0 -2,-0.0 0.735 360.0 360.0-125.7 -35.5 19.6 88.3 70.3 
9 95 E E    0 0 235  0, 0.0 -2,-0.0  0, 0.0  0, 0.0 0.494 360.0 360.0 -8.6 360.0 21.0 91.3 68.3 

所需的輸出

1 87 E P C   0 0 131  0, 0.0  0, 0.0  0, 0.0  0, 0.0 0.000 360.0 360.0 360.0 150.0 7.2 83.8 79.2 
2 88 E V C  + 0 0 136  1,-0.1  2,-0.5  3,-0.0  0, 0.0 0.993 360.0 80.8 -61.8 -61.8 7.7 80.9 76.8 
3 89 E K S S+  0 0 195  2,-0.0  2,-0.3  0, 0.0 -1,-0.1 -0.222 77.4 108.3 -45.5 95.3 5.5 82.5 74.2 
4 90 E R S S-  0 0 153  -2,-0.5  2,-0.5  2,-0.0  0, 0.0 -0.864 72.2-119.8-173.3 140.8 8.2 84.8 72.9 
5 191 E R C  -  0 0 202  -2,-0.3  2,-0.2  1,-0.0 -2,-0.0 -0.772 46.1-115.0 -83.4 130.6 10.4 85.4 70.0 
6 92 E L H  -  0 0 109  -2,-0.5  2,-0.5  1,-0.1 -1,-0.0 -0.499 24.5-142.8 -70.2 134.3 14.0 85.3 71.3 
7 93 E D C  + 0 0 126  -2,-0.2 -1,-0.1  1,-0.1  0, 0.0 -0.852 36.1 149.0-101.0 126.6 15.9 88.6 71.1 
8 94 E L C   0 0 140  -2,-0.5 -1,-0.1  0, 0.0 -2,-0.0 0.735 360.0 360.0-125.7 -35.5 19.6 88.3 70.3 
9 95 E E C   0 0 235  0, 0.0 -2,-0.0  0, 0.0  0, 0.0 0.494 360.0 360.0 -8.6 360.0 21.0 91.3 68.3 
+0

大多數解決方案都要求您的數據具有一致的字段分隔符,如空格或至少具有一致字段或字段集合的字段長度。如果數據中的某個位置由於值較大而導致兩個字段合併爲一個字段,或者一個字段或一組字段會更改預期的固定長度,則該行將被錯誤解釋,並且只能通過應用條件檢查來修復。除非你添加更多關於它的信息,否則我們無法知道。 – konsolebox

回答

1
awk '{a=substr($0, 17, 1);a=(a~/[[:alpha:]]/)?a:"C";print substr($0,1, 16) a substr($0,18)}' file 
2

你如何定義 「第五縱隊」 這不是從你的例子很明顯。如果你的列是固定寬度,那麼「第五列」似乎與第十三個字符位置相對應。

如果這是正確的,那麼就開始十二個字符和空白的任何線與這些相同的十二個字符和一個C.

sed -i 's/^\(............\) /\1C/' filename 

取代如果例如在OSX上,您需要-i '',因爲-i選項需要該平臺上的必需參數。如果您sed缺乏-i乾脆,嘗試相當於Perl腳本:

perl -pi -e 's/^(.{12}) /$1C/' filename 

如果你的數據不是整個固定的寬度,這似乎是不可能推斷出什麼來替代,除非你可以制定你的數據描述更多詳情。

1

使用

use strict; use warnings; 
while (<>) { 
my @f = split(/,/); 
my @v=split(/(\s+)/,$f[0]); 
$v[7] = " C  " if @v < 19; 
$v[7].= "  " if @v < 17; 
$f[0] = join("", @v); 
print join(",", @f); 
} 

執行:

perl script.pl input 

輸出:

1 87 E P C   0 0 131  0, 0.0  0, 0.0  0, 0.0  0, 0.0 0.000 360.0 360.0 360.0 150.0 7.2 83.8 79.2 
2 88 E V C  +  0 0 136  1,-0.1  2,-0.5  3,-0.0  0, 0.0 0.993 360.0 80.8 -61.8 -61.8 7.7 80.9 76.8 
3 89 E K S S+  0 0 195  2,-0.0  2,-0.3  0, 0.0 -1,-0.1 -0.222 77.4 108.3 -45.5 95.3 5.5 82.5 74.2 
4 90 E R S S-  0 0 153  -2,-0.5  2,-0.5  2,-0.0  0, 0.0 -0.864 72.2-119.8-173.3 140.8 8.2 84.8 72.9 
5 191 E R C  -  0 0 202  -2,-0.3  2,-0.2  1,-0.0 -2,-0.0 -0.772 46.1-115.0 -83.4 130.6 10.4 85.4 70.0 
6 92 E L H  -  0 0 109  -2,-0.5  2,-0.5  1,-0.1 -1,-0.0 -0.499 24.5-142.8 -70.2 134.3 14.0 85.3 71.3 
7 93 E D C  +  0 0 126  -2,-0.2 -1,-0.1  1,-0.1  0, 0.0 -0.852 36.1 149.0-101.0 126.6 15.9 88.6 71.1 
8 94 E L C   0 0 140  -2,-0.5 -1,-0.1  0, 0.0 -2,-0.0 0.735 360.0 360.0-125.7 -35.5 19.6 88.3 70.3 
9 95 E E C   0 0 235  0, 0.0 -2,-0.0  0, 0.0  0, 0.0 0.494 360.0 360.0 -8.6 360.0 21.0 91.3 68.3 
+0

感謝您的回答。當我運行你的代碼時,輸​​出中列之間的空間太大。它不像你得到的輸出。我怎樣才能減少空間?我的操作系統是Ubuntu 12.04。 – user2716690

+0

@ user2716690,更新了答案 – perreal

相關問題