我有一个包含数百列的大文件,我只想删除第三列和第四列,并将其余列打印到文件中。我最初的想法是制作像awk '{print $1, $2, for (i=$5; i <= NF; i++) print $i }' file > outfile
这样的awk脚本。但是,此代码不起作用。
然后我尝试了:
awk '{for(i = 1; i<=NF; i++)
if(i == 3 || i == 4) continue
else
print($i)}' file > outfile
但这只是在一个领域打印出来的。可以将它分成两个脚本并将它们与unix paste
组合在一起,但这似乎应该可以在一行中完成。
答案 0 :(得分:14)
你的第一次尝试非常接近。修改它以使用printf
并包括字段分隔符对我有用:
awk '{printf $1FS$2; for (i=5; i <= NF; i++) printf FS$i; print NL }'
答案 1 :(得分:9)
如下:
cat SOURCEFILE | cut -f1-2,5- >> DESTFILE
打印前两列,跳过第3列和第4列,然后从5开始打印到结尾。
答案 2 :(得分:6)
假设您有一个 tab 分隔文件,如下所示:
TEMP.TXT
field1 field2 field3 field4 field5 field6
field1 field2 field3 field4 field5 field6
field1 field2 field3 field4 field5 field6
运行以下命令将删除字段3和4并输出到行尾。
awk '{print $1"\t"$2"\t"substr($0, index($0,$5))}' temp.txt
field1 field2 field5 field6
field1 field2 field5 field6
field1 field2 field5 field6
我的例子打印到stdout。
> newFile
会将stdout发送到newFile,>> newFile
将附加到newFile。
所以你可能想要使用以下内容:
awk '{print $1"\t"$2"\t"substr($0, index($0,$5))}' temp.txt > newFile.txt
cut -f1,2,5- temp.txt
产生相同的输出,并且cut非常简单,但不处理不一致的分隔符。例如,不同空格的混合。但是,在这种情况下,切割可能就是你所追求的。
你也可以在perl,python,ruby和许多其他人中完成这个,但这里是最简单的awk
解决方案。
答案 3 :(得分:2)
如何将第三列和第四列设置为空字符串:
echo 1 2 3 4 5 6 7 8 9 10 |
awk -F" " '{ $3=""; $4=""; print}'
答案 4 :(得分:2)
是的,可以将第三列和第四列设置为空字符串;但是,另外,字段$1
应设置为自身($1=$1
),以使awk
实际消耗整个当前行上的输入字段分隔符(分隔符):
{ {1}}一气呵成。
$0
答案 5 :(得分:0)
艰难但通用的方式(忘记一个简单的oneliner)
awk -v "Exclude=3:4:5" '
# load exclusion
BEGIN{
Count=split(Exclude, aTmp, ":")
for( i = 1; i <= Count; i++) aExc[ aTmp[ i]]=1
}
# treat each line, taking only wanted field
{
Result=""
for( i = 1; i <= NF; i++) {
# field to take ?
if( ! aExc[ i]) {
# first element or add a separator before
if( Result != "") Result=Result OFS $i
else Result=$i
}
}
print Result
}' YourFile
:
分隔的可变排除填写字段索引