我需要在文本文件的每一行中从位置X删除字符串到位置Y.

时间:2014-08-13 18:26:18

标签: unix awk sed textedit

我有一个巨大的平面文件100K记录,每个记录跨越3000列。我需要在归档之前删除一段数据,从位置300开始到位置500。这是我可以归档之前需要擦除的数据的敏感部分。 我正在寻找一个awk或sed或任何类似的命令,可以为我做这个技巧。

示例文件

003133780 MORNING GLORY DR                                        SOUTHAMPTON         PA18966780 MORNING GLORY DR    
0054381303 MADISON ST                                             RADFORD             VA241411303 MADISON ST         
00586728 CONESTOGA COURT                                          CHADDS FORD         PA1931728 CONESTOGA COURT      
1852921800 SAMER RD                                               MILAN               MI481601800 SAMER RD           
192717175 EVERGREEN CIRCLE                                        HENDERSONVILLE      TN37075175 EVERGREEN CIRCLE    
213673217 EAST BRANCH                                             LONGVIEW            TX75604217 EAST BRANCH         
2490423205 NOTTAGE LANE                                           FALLS CHURCH        VA220423205 NOTTAGE LANE       
249357344 BALOGH PLACE                                            LONGWOOD            FL32750344 BALOGH PLACE        
2502811224 WILFORD HOLLOW ROAD                                    VINTON              VA241791224 WILFORD HOLLOW ROAD
277634210 AMANDA CT                                               WHITEHOUSE          TX7579119726 COPPER OAKS DRIVE 
282482507 B ST.                                                   CHESAPEAKE          VA23324507 B ST.               

预期输出

003133780 MORNING GLORY DR                                        SOUTHAMPTON         PA780 MORNING GLORY DR    
0054381303 MADISON ST                                             RADFORD             VA1303 MADISON ST         
00586728 CONESTOGA COURT                                          CHADDS FORD         PA28 CONESTOGA COURT      
1852921800 SAMER RD                                               MILAN               MI1800 SAMER RD           
192717175 EVERGREEN CIRCLE                                        HENDERSONVILLE      TN175 EVERGREEN CIRCLE    
213673217 EAST BRANCH                                             LONGVIEW            TX217 EAST BRANCH         
2490423205 NOTTAGE LANE                                           FALLS CHURCH        VA3205 NOTTAGE LANE       
249357344 BALOGH PLACE                                            LONGWOOD            FL344 BALOGH PLACE        
2502811224 WILFORD HOLLOW ROAD                                    VINTON              VA1224 WILFORD HOLLOW ROAD
277634210 AMANDA CT                                               WHITEHOUSE          TX19726 COPPER OAKS DRIVE 
282482507 B ST.                                                   CHESAPEAKE          VA507 B ST.               

这里我删除了位置89和95之间的字符。 一个小小的改动,我还需要将更改的内容写入同一个文件。

以下是我到目前为止的脚本。 我循环遍历所有文件,将它们分成最大行20000的文件,然后在归档之前从位置X和Y中删除字符。

for ls -1 *.[tT][xX][tT]中的currentfilename 做 echo $ currentfilename tempfilename = $ {currentfilename %%。*} awk -v A =“$ tempfilename”'{filename = A“ Part ”int((NR-1)/ 20000)“。txt”;打印>> filename}'$ currentfilename awk'{print substr($ 0,1,522)substr($ 0,953)>> filename}'$ currentfilename mv $ currentfilename $ APP_ROOT / Archive 完成

3 个答案:

答案 0 :(得分:3)

假设该位置表示列,您可以使用cut选择所需的列。

cut -f 1-299,501-3000 CutMe.txt

如果您的数据以逗号而非制表符分隔,请使用-d

cut -d, -f 1-299,501-3000 CutMe.txt

如果position意味着字符,您可以使用cut -c执行相同操作。

cut -c 1-299,501-3000 CutMe.txt

答案 1 :(得分:1)

假设“位置”意味着“角色”:

awk '{print substr($0,1,299) substr($0,501)}' file

如果没有,则编辑您的问题以添加一些REPRESENTATIVE样本输入和预期输出(例如,每行6列的5行,而不是数千行的数千行)。

答案 2 :(得分:1)

使用sed

sed -r -i.bak 's/(.{299}).{200}/\1/' file

-r选项启用扩展正则表达式。如果你需要使它便携,你可以通过转移括号和曲线删除该选项。 -i选项会在场内进行更改。我已经使用了.bak扩展来防止任何混乱。如果您不需要维护原始备份,则可以将其删除。

对于解决方案,我们只捕获捕获组中的前299个字符,并寻找我们需要删除的下一个200个字符。我们用捕获的组替换整行。