bash - 在文本文件中,根据另一个文件将模式替换为其他模式
问题描述
示例 1
假设我有file1.txt
这个:
line 1
line 45
line 3
line 2
line 24
line 1
而在file2.txt
这个代替:
line 1,WWWW
line 2,EEE
line 3,RRR
我想要的是file2.txt
调查,搜索之前的所有术语并用in,
之后的术语替换它们。我希望忽略所有不存在的行,保留顺序。,
file1.txt
file2.txt
因此,预期的输出应该是file1.txt
:
WWW
line 45
RRR
EEE
line 24
WWW
示例 2
现在,另一个不同需求的例子
file1.txt
:
line1 1
line22 78
line32 65
line3 3
line2 2
line2 2
file2.txt
:
line1 1,SONG1 playing: X | NAME1
line2 2,SONG2 playing: Y | NAME2
line3 3,SONG3 playing: Z | NAME3
预期输出应该是:
SONG1 playing: X | NAME1
line22 78
line32 65
SONG3 playing: Z | NAME3
SONG2 playing: Y | NAME2
SONG2 playing: Y | NAME2
请记住,该脚本包含数百行(5+ MB 的文本)。
解决方案
EDIT2:因为 OP 添加了更多有问题的场景来添加此代码以涵盖现在。
awk 'FNR==NR{val=$1;$1="";sub(/^ +/,"");a[val]=$0;next} $0 in a{$0=a[$0]} 1' FS=',' file2.txt FS=' ' file1.txt
输出如下。
SONG1 playing: X | NAME1
line22 78
line32 65
SONG3 playing: Z | NAME3
SONG2 playing: Y | NAME2
SONG2 playing: Y | NAME2
编辑:由于 OP 更改了 Input_file 示例和预期输出,因此现在添加此解决方案。
awk '
FNR==NR{
a[$1 OFS $2]=$NF
next
}
a[$0]{
$0=a[$0]
}
1
' FS='[, ]' file2.txt FS=" " file1.txt
运行时将输出以下代码:
awk '
FNR==NR{
a[$1 OFS $2]=$NF
next
}
a[$0]{
$0=a[$0]
}
1
' FS='[, ]' file2.txt FS=" " file1.txt
WWWW
line 45
RRR
EEE
line 24
WWWW
请您尝试以下操作。
awk '
FNR==NR{
a[$1 OFS $2]=$NF
next
}
a[$0]{
print a[$0]
}
' FS='[, ]' file2.txt FS=" " file1.txt > temp && mv temp file1.txt
说明:为上述代码添加说明。
awk ' ##Starting awk program from here.
FNR==NR{ ##Checking condition FNR==NR which will be TRUE when file2.txt is being read.
a[$1 OFS $2]=$NF ##Creating an array named a whose index is $1 OFS $2 and value is $NF.
next ##next will skip further statements from here.
}
a[$0]{ ##Checking condition if a[$0] array a whose index $0 is NOT NULL then do following.
print a[$0] ##Printing value of array a with index $0.
}
' FS='[, ]' file2.txt FS=" " file1.txt > temp && mv temp file1.txt ##Setting FS as comma OR space for file2.txt AND setting FS as space for file1.txt
推荐阅读
- python - 计算分组数据框列中的项目对数。(熊猫)
- flutter - 使用 Flutter 进行高效的图像处理?
- devexpress - 开发人员快递数据网格服务器端分页中已访问的页面不会调用 API
- reactjs - 登录成功后,如何导航和显示导航链接
- reactjs - 有没有更好的方法来处理 Reactjs 中的多个文件输入?
- sqlite - QT C++中的全局变量面临一些问题
- python - 具有多个应用程序的 Django 项目结构
- typescript - TypeScript - Readonly 的可变性和反转
- comparison - 如何比较两个 json 响应并查看 Postman 中的差异?
- javascript - 使用顺序工作的 setTimeout() 函数迭代 JSON 对象