剪切命令-等效参数的AWK中的等效补全标志

问题描述

这个问题是对现有question

的跟进

请勿将其标记为重复,因为对问题的期望完全不同

我正在尝试编写一个AWK命令,该命令完全可以完成以下操作

命令1:

cut --complement -c $IGNORE_RANGE file.txt > tmp

命令2:

cut --complement -d,-f$IGNORE_RANGE $report  > tmp

$ IGNORE_RANGE可以是任何值,例如1-5,6或1,3,5 1,3-5等

我无法使用cut,因为我在AIX中并且AIX不支持--complement,有什么方法可以使用AWK命令实现这一目标

命令1的示例

file.txt

abcdefg
1234567

输出

cut --complement -c 1-5,6 file.txt > tmp
g
7


cut --complement -c 1,5 file.txt > tmp
bdfg
2467

cut --complement -c 1,3-5 file.txt > tmp
bfg
267

命令2的示例

file.txt

data1,data2,data3,data4,data5,data6,data7

输出

cut --complement -d,-f 1-5,6 file.txt > tmp
data7

cut --complement -d,-f 1,5 file.txt > tmp
data2,data7

cut --complement -d,3-5 file.txt > tmp
data2,data7

解决方法

OP职位编号问题的第一个解决方案: 您能否请尝试以下通用解决方案,该通用解决方案基于在GNU // Android ./gradlew 中编写和测试的所提供示例,并且需要将执行GNU awk。您可以在awk的{​​{1}}变量中给出以,分隔的范围或单个位置编号。

awk


OP字段号问题的第二种解决方案: 如果要忽略字段,我们可以使用此解决方案(此处以OP的command2示例运行该解决方案)。根据OP的示例,ignore_pos逗号已在此处用作Input_file的字段分隔符。

awk -v FS= -v ignore_pos="1-5,6" '
BEGIN{
  num=split(ignore_pos,array1,",")
  for(i=1;i<=num;i++){
    if(array1[i]~/-/){
       split(array1[i],array2,"-")
       for(j=array2[1];j<=array2[2];j++){
         ignore[j]
       }
    }
    else{
       ignore[array1[i]]
    }
  }
}
{
  for(i=1;i<=NF;i++){
    if(!(i in ignore)){ val=val $i }
  }
  $0=val
  val=""
}
1
'  Input_file

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...