在 file1 中查找单词并复制下一个单词并替换 file2 中的脚本
Script to look for a word in file1 and copy the next word and replace that in file2
我有file1
(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),
(2,'a lot of brazil 4.2.3.1, 'some other info',0,null, 12345),
(3,'a lot of india 3.4.2.1, 'some other info',0,null, 12345),
(4,'a lot of laos 1.3.4.5, 'some other info',0,null, 12345),
(5,'a lot of china 1.2.3.5, 'some other info',0,null, 12345);
和file2
(1'a lot of singapore A.B.C.D 'some other info',0,null, 12345),
(2,'a lot of brazil E.F.G.H, 'some other info',0,null, 12345),
(3,'a lot of india H.I.J.K, 'some other info',0,null, 12345),
(4,'a lot of laos L.M.N.O, 'some other info',0,null, 12345),
(5,'a lot of china P.Q.R.S, 'some other info',0,null, 12345);
我创建了一个脚本,但要复制并替换为行号,但需要输入以在文件 1 中查找 SINGAPORE
并复制下一个单词 1.2.3.4
并在中查找 singapore
file2 并替换 1.2.3.4
- A.B.C.D
中的下一个单词,最终的 file2 看起来像这样
(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),
Python 脚本或 Awk 或 sed
任何脚本都会有帮助。
到目前为止,我已经创建了这个来复制和替换行号
sed -i '2d' File2.txt
awk 'NR==5380{a=[=13=]}NR==FNR{next}FNR==2{print a}1' file1.txt file2.txt
我不确定它是否有效,它是最好的解决方案,但你需要这样的东西。
import re
def try_to_get_country_data(line, country):
line_parts = line.split(',')
part_with_data = line_parts[1]
if (match := re.search(f'.* {country} (.*)', part_with_data)) is not None:
return match.group(1)
return None
if __name__ == "__main__":
found_data = None
country = 'singapore'
with open('some_file.txt', 'r') as f:
for line in f:
if (found_data := try_to_get_country_data(line, country)) is not None:
break
if found_data is not None:
with open('second_file.txt', 'r') as f2:
data = f2.readlines()
for i, line in enumerate(data):
if (replaced_data := try_to_get_country_data(line, country)) is not None:
data[i] = line.replace(replaced_data, found_data)
break
with open('second_file.txt', 'w') as f2:
f2.writelines(data)
所以,我已经检查过了,如果每一行的线条模式相同,它就可以工作。
如果您想要一个简短的 bash
脚本并假设文件的结构是不变的,您可以尝试这样的事情:
country="singapore"
a=$(grep "${country}" file0 | awk '{print }')
if [[ "${a}" ]]
then
b=$(grep -w "${country}" file1 | awk '{print }')
sed "s/${country} ${b}/${country} ${a}/g" file1
fi
在脚本的输出下方找到:
(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),
(2,'a lot of brazil E.F.G.H, 'some other info',0,null, 12345),
(3,'a lot of india H.I.J.K, 'some other info',0,null, 12345),
(4,'a lot of laos L.M.N.O, 'some other info',0,null, 12345),
(5,'a lot of china P.Q.R.S, 'some other info',0,null, 12345);
使用 sed -i
以便就地编辑 file1
。
为了避免多次读取同一个文件而降低一点可读性,最初的做法可以很容易地重构如下:
country="singapore"
file0c=$(cat file0)
file1c=$(cat file1)
a=$(echo "${file1c}" | grep -w "${country}" | awk '{print }')
if [[ "${a}" ]]
then
b=$(echo "${file1c}" | grep -w "${country}" | awk '{print }')
echo "${file1c}" | sed "s/${country} ${b}/${country} ${a}/g" |
tee file1_new
fi
这是一个简单的 Awk 脚本,用于从第一个输入文件中查找替换文本并替换第二个输入文件中的相应标记。
awk -v country="singapore" 'NR == FNR {
for (i=2; i<=NF; i++) if ($(i-1) == country) token = $i; next }
[=10=] ~ country { for(i=2; i<=NF; i++) if ($(i-1) == country) $i = token
} 1' file1 file2 >newfile2
当我们阅读file1
时,NR == FNR
为真。我们遍历输入标记并检查匹配 country
的标记;如果我们找到一个,我们将 token
设置为该值。这意味着如果 country 关键字有多个匹配项,将提取第一个输入文件中的最后一个。
next
语句导致 Awk 跳过此输入文件的其余脚本,因此仅读取来自 file1
的行,而不会进一步处理。
如果我们读到最后一行,我们现在正在阅读 file2
。如果我们看到包含关键字的行,我们将在 country
关键字之后对关键字执行替换。 (这要求关键字是一个独立的标记,而不是一个较长单词中的子串等)最后的 1
导致所有到达这里的行被打印回标准输出,从而生成第二个的副本执行任何替换的文件。
如果您对此处使用的数据格式有任何控制,或许可以尝试找出一种方法,以一种不太随意的 ad-hoc 格式获取输入,例如 JSON.
我有file1
(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),
(2,'a lot of brazil 4.2.3.1, 'some other info',0,null, 12345),
(3,'a lot of india 3.4.2.1, 'some other info',0,null, 12345),
(4,'a lot of laos 1.3.4.5, 'some other info',0,null, 12345),
(5,'a lot of china 1.2.3.5, 'some other info',0,null, 12345);
和file2
(1'a lot of singapore A.B.C.D 'some other info',0,null, 12345),
(2,'a lot of brazil E.F.G.H, 'some other info',0,null, 12345),
(3,'a lot of india H.I.J.K, 'some other info',0,null, 12345),
(4,'a lot of laos L.M.N.O, 'some other info',0,null, 12345),
(5,'a lot of china P.Q.R.S, 'some other info',0,null, 12345);
我创建了一个脚本,但要复制并替换为行号,但需要输入以在文件 1 中查找 SINGAPORE
并复制下一个单词 1.2.3.4
并在中查找 singapore
file2 并替换 1.2.3.4
- A.B.C.D
中的下一个单词,最终的 file2 看起来像这样
(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),
Python 脚本或 Awk 或 sed
任何脚本都会有帮助。
到目前为止,我已经创建了这个来复制和替换行号
sed -i '2d' File2.txt
awk 'NR==5380{a=[=13=]}NR==FNR{next}FNR==2{print a}1' file1.txt file2.txt
我不确定它是否有效,它是最好的解决方案,但你需要这样的东西。
import re
def try_to_get_country_data(line, country):
line_parts = line.split(',')
part_with_data = line_parts[1]
if (match := re.search(f'.* {country} (.*)', part_with_data)) is not None:
return match.group(1)
return None
if __name__ == "__main__":
found_data = None
country = 'singapore'
with open('some_file.txt', 'r') as f:
for line in f:
if (found_data := try_to_get_country_data(line, country)) is not None:
break
if found_data is not None:
with open('second_file.txt', 'r') as f2:
data = f2.readlines()
for i, line in enumerate(data):
if (replaced_data := try_to_get_country_data(line, country)) is not None:
data[i] = line.replace(replaced_data, found_data)
break
with open('second_file.txt', 'w') as f2:
f2.writelines(data)
所以,我已经检查过了,如果每一行的线条模式相同,它就可以工作。
如果您想要一个简短的 bash
脚本并假设文件的结构是不变的,您可以尝试这样的事情:
country="singapore"
a=$(grep "${country}" file0 | awk '{print }')
if [[ "${a}" ]]
then
b=$(grep -w "${country}" file1 | awk '{print }')
sed "s/${country} ${b}/${country} ${a}/g" file1
fi
在脚本的输出下方找到:
(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),
(2,'a lot of brazil E.F.G.H, 'some other info',0,null, 12345),
(3,'a lot of india H.I.J.K, 'some other info',0,null, 12345),
(4,'a lot of laos L.M.N.O, 'some other info',0,null, 12345),
(5,'a lot of china P.Q.R.S, 'some other info',0,null, 12345);
使用 sed -i
以便就地编辑 file1
。
为了避免多次读取同一个文件而降低一点可读性,最初的做法可以很容易地重构如下:
country="singapore"
file0c=$(cat file0)
file1c=$(cat file1)
a=$(echo "${file1c}" | grep -w "${country}" | awk '{print }')
if [[ "${a}" ]]
then
b=$(echo "${file1c}" | grep -w "${country}" | awk '{print }')
echo "${file1c}" | sed "s/${country} ${b}/${country} ${a}/g" |
tee file1_new
fi
这是一个简单的 Awk 脚本,用于从第一个输入文件中查找替换文本并替换第二个输入文件中的相应标记。
awk -v country="singapore" 'NR == FNR {
for (i=2; i<=NF; i++) if ($(i-1) == country) token = $i; next }
[=10=] ~ country { for(i=2; i<=NF; i++) if ($(i-1) == country) $i = token
} 1' file1 file2 >newfile2
当我们阅读file1
时,NR == FNR
为真。我们遍历输入标记并检查匹配 country
的标记;如果我们找到一个,我们将 token
设置为该值。这意味着如果 country 关键字有多个匹配项,将提取第一个输入文件中的最后一个。
next
语句导致 Awk 跳过此输入文件的其余脚本,因此仅读取来自 file1
的行,而不会进一步处理。
如果我们读到最后一行,我们现在正在阅读 file2
。如果我们看到包含关键字的行,我们将在 country
关键字之后对关键字执行替换。 (这要求关键字是一个独立的标记,而不是一个较长单词中的子串等)最后的 1
导致所有到达这里的行被打印回标准输出,从而生成第二个的副本执行任何替换的文件。
如果您对此处使用的数据格式有任何控制,或许可以尝试找出一种方法,以一种不太随意的 ad-hoc 格式获取输入,例如 JSON.