在给定另一列的情况下获取一列的内容

Get the contents of one column given another column

我有一个包含 3 列的制表符分隔文件。我想获取第一列的内容,但仅限于第 3 列等于 8 的行。如何提取这些值?如果我只想提取第一列中的值,我会执行以下操作:

cat file1 | tr "\t" "~" | cut -d"~" -f1 >> file_with_column_3

我在想:

cat file1 | tr "\t" "~" | if cut -d"~" -f3==8; then cut -d"~" -f1 ; fi>> file_with_column_3

但这似乎不太奏效。

awk 可以更好地处理这个问题:

awk -F '\t' ' == 8 { print  }' file1

鉴于您的文件是用制表符分隔的,这个问题似乎很适合 awk

像下面这样简单的东西应该适合你,虽然没有任何样本数据我不能肯定地说(尽量在 SO 的问题中包含它)

awk -F'\t' '==8 {print }' inputfile > outputfile

-F'\t' 将输入分隔符设置为制表符。

==8 比较基于该分隔符的第 3 列是否为 8。

如果是,则执行 {print },打印第一列。

否则,什么都不做,awk 继续到下一行。

如果你的文件有一个 header 你想保留,你可以像下面这样修改它,它告诉 awk 在当前记录号为 1 时打印。

awk -F'\t' 'NR==1 {print;} ==8 {print }' inputfile > outputfile

你也可以用 bash 来做:

cat x | while read y; do split=(${y}); [ ${split[2]} == '8' ] && echo $split[0]; done

输入在变量y中读取,然后拆分成一个数组。 IFS(输入字段分隔符)默认为 <space><tab<>newline>,因此它也在选项卡上拆分。然后将数组的第三个字段与“8”进行比较。如果相等,则打印数组的第一个字段。请记住,数组中的字段从零开始计数。