【发布时间】:2014-08-15 01:59:25
【问题描述】:
我有一个巨大的平面文件 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 中删除字符。
ls -1 *.[tT][xX][tT] 中的当前文件名
做
回声$当前文件名
临时文件名=${当前文件名%%.*}
awk -v A="$tempfilename" '{filename = A "Part" int((NR-1)/20000) ".txt";打印 >> 文件名}' $当前文件名
awk '{print substr($0,1,522) substr($0,953) >> 文件名}' $currentfilename
mv $currentfilename $APP_ROOT/存档
完成
【问题讨论】:
-
列 300 到 500,或字符 300 到 500?
-
你确定它不是从 301 开始的吗?另外,如果它们是列,每列是如何分开的?是否愿意提供示例输入,即使只有 1 行?也可以上传到
pastebin.com。 -
你的分隔符是什么?逗号还是制表符?