我的文本文件包含列中的数据。我想删除一列或多列中的x行数。 我原来的文件看起来是:
Column.1 Column.2 Column.3 Column.4 Column.5
dhd21 393j A/B/C/ 1224 ouiyt
nvd0 8ncbb E/F/G 125a b09bv
xnxb x9jd m/f/e/ ljkjh bhh66
hyru jsdj M7D7W7Q7 mnuy bbbb
098y sa56 by6 hhgt xghsh
我希望输出看起来像这样,(例如从第2列删除3行,从第4列删除4):
Column.1 Column.2 Column.3 Column.4 Column.5
dhd21 393j A/B/C/ 1224 ouiyt
nvd0 8ncbb E/F/G b09bv
xnxb m/f/e/ bhh66
hyru M7D7W7Q7 bbbb
098y by6 xghsh
我的代码需要整列:
FOR /f "tokens=2,3 delims= " %%B in (in.txt) do @echo %%B %%C >> out.txt
答案 0 :(得分:0)
这可以使用sqlite3.exe批量完成。如果你没有sqlite3 已经,你可以从Sqlite download页面获取它。 它是一个小的独立可执行文件。
@echo off
setlocal
sqlite3 ^
-cmd "create table t1 (c1, c2, c3, c4, c5)" ^
-cmd ".mode tab" ^
-cmd ".import test.csv t1" ^
-cmd "update t1 set c4 = '' where c1 = 'nvd0'" ^
-cmd "update t1 set c2 = '', c4 = '' where c1 = 'xnxb'" ^
-cmd "update t1 set c2 = '', c4 = '' where c1 = 'hyru'" ^
-cmd "update t1 set c2 = '', c4 = '' where c1 = '098y'" ^
-cmd ".separator \"\t\" \"\r\n\"" ^
-cmd ".once output.csv" ^
-cmd "select * from t1" ^
":memory:" ""
echo Done
由于命令很长,因此在行尾使用^
将继续
命令到下一行。
表t1
在内存中创建,有5列。 .mode tab
和
.import test.csv t1
允许从文件导入的操作
test.csv
使用制表符分隔符并插入表t1
。
对表中c1
=(值匹配)的行进行了四次更新。
如果满足条件,则可以将第2列或第4列或两者设置为空字符串。
.separator
...将制表符设置为分隔符,将CRLF设置为输出的行尾。
.once
...将输出文件设置为output.csv
,以便下一个sql命令
只处理一次。
select * from t1
打印表t1
的所有行和所有列。
:memory:
告诉sqlite3使用内存数据库而不是文件。
以下空引号只是一个空的sql语句所以
sqlite3将在没有交互的情况下关闭。
注意:在双引号参数中使用双引号,\
可以转义
在"\"abc\""
内的双引号被剥去外部
解释器引用,因此您将留下带引号的字符串"abc"
。