awk 命令遇到错误

awk 命令遇到错误

输入:

123456.00|aswani|india|ap
23456.00|rani|us|tel
233|ramu|londan|vih

输出:

aswani|ap
rani|tel
ramu|vih

我正在尝试使用命令获取此输出

awk '{FS="|";OFS="|"}{print $2,$4}'

但我得到的输出为:

|
rani|tel
ramu|vih

命令从 2 行执行,但不是从第一行执行。我正在尝试与第一行一起输出

答案1

您应该将第一个块(设置 FS 和 OFS)放在“BEGIN”块内:

awk 'BEGIN {FS="|";OFS="|"} {print $2,$4}'

将运行“BEGIN”块第一行文本已处理。相反,您拥有的独立块将在其上运行每一个行文本,但对于第一行,设置 FS 会发生得太晚,因为字段已经被分割。

另一种方法是通过 awk 命令行选项设置 FS,但您仍然需要处理 OFS:

awk -F '|' '{OFS="|"; print $2,$4}'

或者:

awk -F '|' -v OFS='|' '{print $2,$4}'

更新:正如 @Kusalananda 所指出的,awk如果 FS 重置,某些实现(例如 BSD awk)将重新分割字段,因此不需要在“BEGIN”块中进行设置。在 GNU awk 中(通常是 Linux 发行版中的一种),这种情况不会发生,因此需要在分割行之前设置 FS。

答案2

作为菲尔布兰登指出GNU awk(和mawk)需要FS正确设置读取第一行,否则它将在默认字段分隔符(一系列空格)上分割该行。您的代码集FS 读取每一行,因此在处理文件的第一行时将会有错误的值。

OpenBSD awk(至少)的行为有所不同,并且似乎在访问字段时分割当前记录,但在此之前不会。这意味着您的代码实际上可以在 OpenBSD 系统上运行。

我只是要补充一点,要从文件中提取一组列而不进行进一步处理,该cut命令也很有用:

$ cut -d '|' -f 2,4 <file
aswani|ap
rani|tel
ramu|vih

相关内容