这是test.txt:
0x01,0xDF,0x93,0x65,0xF8
0x01,0xB0,0x01,0x03,0x02,0x00,0x64,0x06,0x01,0xB0
0x01,0xB2,0x00,0x76
Run Code Online (Sandbox Code Playgroud)
如果我运行
awk -F, 'BEGIN{OFS=","}{$2="";print $0}' test.txt
结果是:
0x01,,0x93,0x65,0xF8
0x01,,0x01,0x03,0x02,0x00,0x64,0x06,0x01,0xB0
0x01,,0x00,0x76
Run Code Online (Sandbox Code Playgroud)
$2 没有被删除,它只是变空了。我希望在打印 $0 时,结果是:
0x01,0x93,0x65,0xF8
0x01,0x01,0x03,0x02,0x00,0x64,0x06,0x01,0xB0
0x01,0x00,0x76
Run Code Online (Sandbox Code Playgroud)
anu*_*ava 28
所有现有的解决方案都很好,尽管这实际上是为以下人员量身定制的工作cut:
cut -d, -f 1,3- file
0x01,0x93,0x65,0xF8
0x01,0x01,0x03,0x02,0x00,0x64,0x06,0x01,0xB0
0x01,0x00,0x76
Run Code Online (Sandbox Code Playgroud)
如果要删除第三个字段,请使用:
cut -d, -f 1,2,4- file
Run Code Online (Sandbox Code Playgroud)
要删除第 4 个字段,请使用:
cut -d, -f 1-3,5- file
Run Code Online (Sandbox Code Playgroud)
Rav*_*h13 11
我相信最简单的方法是使用subfunction,,用 single替换第一次出现的连续(在您将第二个字段设为NULL 后创建),。但这假设您在字段值之间没有任何逗号。
awk 'BEGIN{FS=OFS=","}{$2="";sub(/,,/,",");print $0}' Input_file
Run Code Online (Sandbox Code Playgroud)
第二种解决方案:或者您可以使用match函数来捕获从第一个逗号到下一个逗号出现的正则表达式,并在匹配字符串的行之前和之后获取。
awk '
match($0,/,[^,]*,/){
print substr($0,1,RSTART-1)","substr($0,RSTART+RLENGTH)
}' Input_file
Run Code Online (Sandbox Code Playgroud)
这有点笨手笨脚,但这会将字段 2 之后的每个字段向下移动一个位置,然后进行更改,NF因此不需要的字段不存在:
$ awk -F, -v OFS=, '{ for (i = 2; i < NF; i++) $i = $(i+1); NF--; print }' test.txt
0x01,0x93,0x65,0xF8
0x01,0x01,0x03,0x02,0x00,0x64,0x06,0x01
0x01,0x00,0x76
$
Run Code Online (Sandbox Code Playgroud)
使用 GNU Awk 4.1.3 和 BSD Awk 进行测试(awk version 20070501macOS Mojave 10.14.6 上的“ ”——别问;这也让我感到沮丧,但有时雇主并不擅长前瞻性思维)。设置NF在旧版本的 Awk 上可能有效也可能无效——我有点惊讶它确实有效,但惊喜是一个令人愉快的变化。