在给定另一列的情况下获取一列的内容
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”进行比较。如果相等,则打印数组的第一个字段。请记住,数组中的字段从零开始计数。
我有一个包含 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”进行比较。如果相等,则打印数组的第一个字段。请记住,数组中的字段从零开始计数。