awk:第 1 行:在 或附近有语法错误,

awk:第 1 行:在 或附近有语法错误,

我尝试在 dpkg 中对我的文件使用 awk 命令,但出现以下错误:

awk  '{print $1,$6}' cmd.txt > cmd2.txt

文件内容:

Port         Protocol Type              Board Name                FQBN             Core       
/dev/ttyACM0 serial   Serial Port (USB) Unknown                                               
/dev/ttyACM1 serial   Serial Port (USB) Arduino Mega or Mega 2560 arduino:avr:mega arduino:avr
/dev/ttyAMA0 serial   Serial Port       Unknown                                               
/dev/ttyAMA1 serial   Serial Port       Unknown                                               
/dev/ttyAMA2 serial   Serial Port       Unknown                                               
/dev/ttyAMA3 serial   Serial Port       Unknown                                               
/dev/ttyS0   serial   Serial Port       Unknown                                               
/dev/ttyUSB0 serial   Serial Port (USB) Unknown                                               
/dev/ttyUSB1 serial   Serial Port (USB) Unknown                                               
/dev/ttyUSB2 serial   Serial Port (USB) Unknown                                               
/dev/ttyUSB3 serial   Serial Port (USB) Unknown

似乎在 dpkg 中,存在不同的行为。有人可以给我一些建议吗?

编辑:我的理想情况

arduino-cli board list | awk -F ' ' '{print $1,$6}' |while read var1 var2
do
  if [ "$var2" == "Arduino" ];then
      device_path=$var1
      dosomething...
      break;
  fi
done

答案1

Awk 使用记录分隔符(即空格、逗号、分号……)。您的输入文件没有分隔符,而是以列格式显示。不幸的是,一些数据列(3 和 4)包含空格。

你可以用这个

cut -c 1-13,84- cmd.txt > cmd2.txt

或这个:

awk  '{print substr($0,1,12) " " substr($0,84)}' cmd.txt > cmd2.txt

这些解决方案的最大问题是每列的长度!

但可以确定长度:

Awk 脚本文件columns.awk

#! /usr/bin/awk -f

BEGIN {
    COLS[++NB_COLS] = "Port"
    COLS[++NB_COLS] = "Protocol"
    COLS[++NB_COLS] = "Type"
    COLS[++NB_COLS] = "Board Name"
    COLS[++NB_COLS] = "FQBN"
    COLS[++NB_COLS] = "Core"
}
NR == 1 {
    for (COL in COLS) {
        START_COL[COL] = index($0, COLS[COL])
        if (COL > 1) {
            LEN_COL[COL - 1] = START_COL[COL] - START_COL[COL - 1] - 1
        }
    }
    LEN_COL[NB_COLS]=length($0)
}
{
    print substr($0, START_COL[1], LEN_COL[1]) " " substr($0, START_COL[6], LEN_COL[6])
}

和:

chmod 755 columns.awk

用法如下:

./columns.awk cmd.txt > cmd2.txt

cmd2.txt文件内容:

Port         Core
/dev/ttyACM0 
/dev/ttyACM1 arduino:avr
/dev/ttyAMA0 
/dev/ttyAMA1 
/dev/ttyAMA2 
/dev/ttyAMA3 
/dev/ttyS0   
/dev/ttyUSB0 
/dev/ttyUSB1 
/dev/ttyUSB2 
/dev/ttyUSB3 

相关内容