我有两个文件 - 一个包含地址(行号),另一个包含数据,如下所示:
地址文件:
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中执行此操作,但尚未找到任何解决方案。
答案 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==FNR
。 data.txt
让next
转到下一行而不再处理记录
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