将变量传递给awk或仅存储第一个字段

时间:2014-09-23 04:55:01

标签: bash awk cut

我有一个数据文件,我需要根据第一个字段的值(第0列0列)进行过滤。例如,使用此数据:

123 test1
123 test2
321 test3
321 test4
451 test5

我需要生成此输出:

123 test1
123 test2

所以我需要一些方法来存储第一个字段并在awk中匹配它。问题是每行都运行awk代码,因此始终会覆盖变量。切割第一个字段的解决方案是将其存储在变量中并与awk中的变量匹配吗?如果是这样,你能提供一个例子吗?

此代码存在的问题是它没有打印第一个匹配项,它会更新field,以便打印其他不需要的匹配项。

awk -F"  " '
$1 == field {
        print; 
}
$1 != field {
        field = $1
}
' data.txt > awkOutput.txt

3 个答案:

答案 0 :(得分:0)

awk的默认字段分隔符是空格序列,因此您无需设置-F" "。由于您只对第一行的第一个字段感兴趣,请使用包含行号的NR变量。

以下awk单行代码可满足您的需求:

$ awk 'NR==1{ field = $1 }$1==field' file
123 test1
123 test2

NR==1是仅为第一行执行的模式。我们将变量field设置为$1。下一个模式检查第一列是否等于我们的变量。如果匹配,则返回真值。在awk中,真值会触发该行的默认打印。

答案 1 :(得分:0)

如果不必在awk中完全完成,我建议这样的事情:

grep "^`head -1 data.txt | awk '{print $1}'`" data.txt > Output.txt

答案 2 :(得分:0)

我不确定这是否会有所帮助,但你也可以试试这个:

 awk 'BEGINs{FS=" "} $1=="123" {printf( "%s\t%s\n", $1, $2)}' input.txt

如果第一个字段匹配“123”(即$ 1 ==“123”),输出将打印第一个和第二个字段(中间有一个标签(即\ t)),它将开始一个新行(即\ n)。