输入:
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