cut命令——在AWK中为复杂参数等效的补码标志



此问题是现有问题的后续问题

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

我正试图编写一个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,51,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位置号问题的第一个解决方案: 您能尝试以下内容吗?这是一个基于所提供的用GNUawk编写和测试的样本的通用解决方案,需要执行GNUawk。可以在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 }
}
$0=val
val=""
}
1
'  Input_file


OP字段号问题的第二个解决方案:当想要忽略字段时,我们可以使用这个解决方案(OP的命令在这里举了两个例子来运行这个(。根据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  }
}
$0=val
}
1
' Input_file

最新更新