cut command --complement flag equivalent in AWK for a complex parameter

cut command --complement flag equivalent in AWK for a complex parameter

此问题是对现有

的后续问题

不要将此标记为重复,因为问题的预期完全不同

我正在尝试编写一个完全执行以下操作的 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,3,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,3,5 file.txt > tmp
data2,data4,data6,data7

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

OP 位置编号问题的第一个解决方案: 您能否尝试以下,一个基于提供的示例编写和测试的通用解决方案GNU awk 并且需要 GNU awk 来执行。可以在 awkignore_pos 变量中给出由 , 分隔的范围或单个位置编号。

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 }
  }
  [=10=]=val
  val=""
}
1
'  Input_file


OP的字段数问题的第二个解决方案:当一个人想忽略字段时,我们可以使用这个解决方案(OP的command2示例这里是 运行 这个)。根据 OP 的示例,,此处已将逗号用作 Input_file 的字段分隔符。

awk -v ignore_field="1-5,6" '
BEGIN{
  FS=OFS=","
  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++){
        ignoreFields[j]
      }
    }
    else{
      ignoreFields[array1[i]]
    }
  }
}
{
  for(i=1;i<=NF;i++){
    val=""
    if(!(i in ignoreFields)){  val=(val?val OFS:"")$i  }
  }
  [=11=]=val
}
1
' Input_file