在另一列中获取一列的内容

时间:2015-03-12 20:25:19

标签: bash shell unix

我有一个带有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

但这似乎没有用。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

鉴于您的文件以制表符分隔,似乎此问题非常适合awk

像下面这样简单的东西应该适合你,虽然没有任何样本数据我不能肯定地说(试着总是把这个问题包括在SO上)

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

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

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

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

否则,什么也没做,awk进入下一行。

如果你的文件有一个你想要保留的标题,你可以像下面这样修改它,如果当前记录号是1,它会告诉awk打印。

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

答案 2 :(得分:1)

你也可以用bash来做:

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

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