我有一个包含以下记录的文件:
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只跳过第一行。 我尝试删除第一条记录,但是行为是相同的,它将跳过第一行。
答案 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