我有一个 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
:完全打印任何匹配的行:
awk '/regexp/' file.txt
- 打印与正则表达式匹配的行awk 'NR==3' file.txt
- 打印第3行awk '1' file.txt
- 打印 1 为 true 的所有行,即全部(好吧,这是一种 awk-ward 的猫方式,但我们正在接近您所做的)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
。