为什么awk不过滤文件第一行中的第一列?

时间:2018-10-22 13:52:13

标签: awk

我有一个包含以下记录的文件:

depots/import/HDN1YYAA_15102018.txt;1;CAB001
depots/import/HDN1YYAA_20102018.txt;2;CLI001
depots/import/HDN1YYAA_20102018.txt;32;CLI001
depots/import/HDN1YYAA_25102018.txt;1;CAB001
depots/import/HDN1YYAA_50102018.txt;1;CAB001
depots/import/HDN1YYAA_65102018.txt;1;CAB001
depots/import/HDN1YYAA_80102018.txt;2;CLI001
depots/import/HDN1YYAA_93102018.txt;2;CLI001

当我执行以下oneliner awk时:

cat lignes_en_erreur.txt | awk 'FS=";"{ if(NR==1){print $1}}END {}'

输出不是预期的:

 depots/import/HDN1YYAA_15102018.txt;1;CAB001

我想只获得第一栏:

如果我通过所有记录运行它:

cat lignes_en_erreur.txt | awk 'FS=";"{ if(NR>0){print $1}}END {}'

然后它将仅在第二行之后开始过滤,并且我得到以下输出:

depots/import/HDN1YYAA_15102018.txt;1;CAB001
depots/import/HDN1YYAA_20102018.txt
depots/import/HDN1YYAA_20102018.txt
depots/import/HDN1YYAA_25102018.txt
depots/import/HDN1YYAA_50102018.txt
depots/import/HDN1YYAA_65102018.txt
depots/import/HDN1YYAA_80102018.txt
depots/import/HDN1YYAA_93102018.txt

有人知道为什么awk只跳过第一行。 我尝试删除第一条记录,但是行为是相同的,它将跳过第一行。

3 个答案:

答案 0 :(得分:4)

首先,应该是

awk 'BEGIN{FS=";"}{ if(NR==1){print $1}}END {}' filename

如果它为空,则可以省略END块:

awk 'BEGIN{FS=";"}{ if(NR==1){print $1}}' filename

您可以使用-F命令行参数来设置字段定界符:

awk -F';' '{if(NR==1){print $1}}' filename

此外,awk程序由一系列CONDITION [{ACTIONS}]元素组成,您可以省略if

awk -F';' 'NR==1 {print $1}' filename

答案 1 :(得分:1)

您需要在BEGIN块中或作为命令行选项指定分隔符:

awk 'BEGIN{FS=";"}{ if(NR==1){print $1}}'
awk -F ';' '{ if(NR==1){print $1}}'

答案 2 :(得分:0)

cut在这里可能更适合所有行

$ cut -d';' -f1 file

跳过第一行

$ sed 1d file | cut -d';' -f1

仅获得第一行

$ sed 1q file | cut -d';' -f1

不过,此时最好切换到awk

如果文件很大并且只对第一行感兴趣,最好早点退出

$ awk -F';' '{print $1; exit}' file