我尝试在 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