根据另一个文件中的行号从文件中拾取行

时间:2017-06-09 04:05:28

标签: python bash awk

我有两个文件 - 一个包含地址(行号),另一个包含数据,如下所示:

地址文件:

2
4
6
7
1
3
5

数据文件

1.000451451
2.000589214
3.117892278
4.479511994
5.484514874
6.784499874
7.021239396

我想根据地址文件的数量随机化数据文件 所以我得到了:

2.000589214
4.479511994
6.784499874
7.021239396
1.000451451
3.117892278
5.484514874

我想在python或bash中执行此操作,但尚未找到任何解决方案。

3 个答案:

答案 0 :(得分:3)

如果您不介意sed,我们可以使用process substitution轻松实现此目标:

sed -nf <(sed 's/$/p/' addr.txt) data.txt
  • -n禁止默认打印
  • -f从流程替换sed
  • 中获取<(...)个读取命令
  • <(sed 's/$/p/' addr.txt)根据sed
  • 中的行号创建addr.txt个打印命令

给出输出:

2.000589214
4.479511994
6.784499874
7.021239396
1.000451451
3.117892278
5.484514874

答案 1 :(得分:2)

使用awk

awk 'NR==FNR {a[NR]=$0; next} {print a[$0]}' data.txt addr.txt
  • NR==FNR {a[NR]=$0; next}创建一个关联数组a,其中键是记录(行)编号,值是整个记录,这仅适用于第一个文件({{1} }),这是NR==FNRdata.txtnext转到下一行而不再处理记录

  • awk打印数组中的值,其中键是当前文件的({print a[$0]})行(记录)编号

示例:

addr.txt

答案 2 :(得分:0)

您也可以在Python内执行此操作,例如:

with open("address_file", 'r') as f1, open("data_file", "r") as f2:
    data1 = f1.read().splitlines()
    data2 = f2.read().splitlines()

for k in data1:
    # Handle exceptions if there is any
    try:
        print(data2[int(k)-1])
    except Exception:
        pass

修改:正如@heemayl所建议的,这是另一个只使用一个list的解决方案:

with open("file1", 'r') as f1, open("file2", 'r') as f2:
    data = f2.read().splitlines()

    for k in f1.read().splitlines():
        print(data[int(k)-1])

两者都会输出:

2.000589214
4.479511994
6.784499874
7.021239396
1.000451451
3.117892278
5.484514874