awking txt 文件中的列出现问题

awking txt 文件中的列出现问题

我有一个 txt 文件(input.txt),如下所示:

A_Karitiana-4.DG        Ignore_Karitiana(discovery).DG
A_French-4.DG   Ignore_French(discovery).DG
A_Dinka-4.DG    Dinka.DG
A_Dai-5.DG      Dai.DG
S_Dai-2.DG      Dai.DG
B_Dai-4.DG      Dai.DG
S_Dai-3.DG      Dai.DG
S_Dai-1.DG      Dai.DG

我需要创建一个新的 txt 文件 (output.txt),其中仅包含 input.txt 的第一列。因此,output.txt 必须如下所示:

A_Karitiana-4.DG        
A_French-4.DG   
A_Dinka-4.DG    
A_Dai-5.DG      
S_Dai-2.DG      
B_Dai-4.DG      
S_Dai-3.DG      
S_Dai-1.DG      

我尝试过使用这个命令:

awk '$1' input.txt > output.txt

还有这个:

awk -F' ' '$1' input.txt > output.txt

但它们都创建了一个看起来与 input.txt 完全相同的output.txt 文件。

我想这是一个分隔符的问题,但我不知道如何解决这个问题。

答案1

你不打印。尝试

awk '{print $1}' input.txt > output.txt

当您只给出一个表达式(您尝试的方式)时,awk其工作方式有点像默认grep:完全打印任何匹配的行:

  1. awk '/regexp/' file.txt- 打印与正则表达式匹配的行
  2. awk 'NR==3' file.txt- 打印第3行
  3. awk '1' file.txt- 打印 1 为 true 的所有行,即全部(好吧,这是一种 awk-ward 的猫方式,但我们正在接近您所做的)
  4. awk '$1' file.txt- 打印所有$1评估为 true 的行,即非空(并且不会评估为 false,例如“0”),即给定您的文件,打印所有行(因为$1这里将始终包含非数字,非空字符串)

答案2

awk 脚本由pattern {action}对组成。

  • 如果pattern为空,则将{action}应用于所有记录
  • 如果{action}为空,则默认操作{print}将应用于所有匹配的记录pattern

awk '$1'{print}将应用模式时的默认操作$1评估为真。由于非空细绳为 true 时,它​​将打印所有非空记录的全部,但第一个字段在您的语言环境中计算为零的记录除外。

相反,您想要应用- 默认操作{print $1}-默认默认空模式:

awk '{print $1}' input.txt > output.txt

答案3

虽然这是一个awk问题,但我仍然会cut在这里提出作为此特定任务的良好替代方案:

cut -d' ' -f1 input.txt > output.txt

默认分隔符(制表符)已由 替换为空格,-d' '并由 选定第一个字段-f1

相关内容