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
来执行。可以在 awk
的 ignore_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
此问题是对现有
不要将此标记为重复,因为问题的预期完全不同
我正在尝试编写一个完全执行以下操作的 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
来执行。可以在 awk
的 ignore_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