我有一个带有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
但这似乎没有用。
答案 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'进行比较。如果等于,则打印数组的第一个字段。请记住,数组中的字段从零开始计数。