查找另一个文件中文件的行索引

时间:2017-02-28 16:33:17

标签: bash shell

我正在尝试将一个文件中的行替换为另一个文件中的位置行号,其中包含第一个文件成员的唯一元素。

E.g。

file1.txt
----------
A
A
A
B
B
C
C
C

,第二个文件是

labels.txt
----------
A
B
C

然后我试图得到以下输出:

1
1
1
2
2
3
3
3

我尝试了grep的一些变体,但没有任何可以正确执行此操作的变体。

获取labels.txt中file1.txt中每个字母的行号可以正常工作:grep -n A labels.txtgrep -n B labels.txt

但是当我尝试使用这两个文件作为输入:grep -n file1.txt labels.txt时,控制台上没有输出。

这当然在Python或其他东西中非常简单,但是这个版本的shell版本非常有用。(这样的事情在从各种数据集的字符串制作分类标签时可以用来训练分类模型等。)。

3 个答案:

答案 0 :(得分:3)

awk 'FNR==NR{a[$0]=NR;next}{print a[$0]}' labels.txt file1.txt

文件参数顺序很重要。在解析第一个输入(FNR==NR)时,我们将行号(NR)存储到使用行值(A,B etc)索引的数组中。然后在解析第二个时,这意味着当FNR==NR为假时,我们打印我们找到的行的存储值。

答案 1 :(得分:2)

一种可能的方法是将grepawk组合在一起,如下所示:

for i in `cat file1.txt`;
do
   grep -n label.txt -e $i|awk -F":" '{print $1}';
done

答案 2 :(得分:1)

您可以使用

获取亚麻布
grep -n . labels.txt

了解亚麻布,你可以说出你想要的东西

grep -n . labels.txt| sed 's/^\([^:]*\):\(.*\)/substitute \2 with \1/'

对于这些替换,sed需要一个带有

等行的命令文件
grep -n . labels.txt| sed 's/^\([^:]*\):\(.*\)/s#^\2$#\1#/'

您可以使用进程替换来跳过临时文件

sed -f <(grep -n . labels.txt| sed 's/^\([^:]*\):\(.*\)/s#^\2$#\1#/') file1.txt