首先,如果我在发布之前没有遇到类似的答案,请道歉。
我试图根据几个条件创建第三个文件。
我有两个输入文件
file1(制表符分隔): -
X_ID1 y_id11 num1
X_ID2 y_id31 num2
X_ID3 y_id34 num3
X_ID4 y_id23 num4
X_ID5 y_id2 num5
...
...
文件2: -
BIOTIC AND ABIOTIC STRESS
x_id2
REGULATION OF TRANSCRIPTION
x_id1
x_id4
HORMONES
x_id5
REGULATION
x_id6
x_id13
...
...
****请注意,文件1的第1列是大写的,文件2中的数据是小写的
我想要的是输出文件(file3)如下: -
BIOTIC AND ABIOTIC STRESS
y_id31
REGULATION OF TRANSCRIPTION
y_id11
y_id23
HORMONES
y_id2
...
...
基本上,如果我想到一个"伪代码"它如下: -
while read $line from file2; do
if [[line1 != x_*]]; then
print $line
else
match $line (case insensitively) with column 1 of file1 and print respective column2 of file1
fi
done
你能帮我解决这个问题吗?
提前多多感谢!
答案 0 :(得分:4)
在awk中:
$ awk 'NR==FNR{a[tolower($1)]=$2;next}{print ($1 in a?a[$1]:$0)}' file1 file2
BIOTIC AND ABIOTIC STRESS
y_id31
REGULATION OF TRANSCRIPTION
y_id11
y_id23
HORMONES
y_id2
REGULATION
x_id6
x_id13
说明:
$ awk '
NR==FNR { # first file
a[tolower($1)]=$2 # hash to a, key is lowercase $1 data is $2
next # skip tp next record
}
{ # second file
print ($1 in a?a[$1]:$0) # if $1 exists in hash a, print it, else print current
}' file1 file2 # mind the order
在@Sundeep的建议中,this是awk中两个文件处理的好介绍。
答案 1 :(得分:1)
OLD_IFS="${IFS}"
IFS=$'\n'
for line in `cat file2`
do
if [[ -z `echo "${line}" | grep x_*` ]]
then
echo "${line}"
else
grep -i "${line}" file1 | awk -F ' ' '{print $2}'
fi
done
IFS="${OLD_IFS}"
答案 2 :(得分:0)
可以通过一个while循环完成: -
while IFS= read -r line;
do
var=`echo $line | tr '[a-z]' '[A-Z]'`
col2=`grep "$var" file1|cut -d" " -f2`
if [[ -z "$col2" ]] ; then
echo "$line" >> file3
else
echo "$col2" >> file3
fi
done < file2
说明: -
var=echo $line | tr '[a-z]' '[A-Z]'
- 将小案例转换为UPPER案例。
col2=grep "$var" file1|cut -d" " -f2
- 匹配来自file1的模式。如果没有匹配,即变量col2为空,则将行写入文件 file3 ,否则将col2写入文件。