我有一个巨大的平面文件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
完成
答案 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个字符。我们用捕获的组替换整行。