bash - 在文本文件中,根据另一个文件将模式替换为其他模式

标签 bash awk

示例 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,搜索 , 之前的所有术语,并将它们替换为 ,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 的文本)。

最佳答案

编辑2:因为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

enter image description here



编辑:由于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

关于bash - 在文本文件中,根据另一个文件将模式替换为其他模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59036221/

相关文章:

bash - 如果存在匹配,则将文本附加到下一行的开头

bash - 尝试格式化音乐文件的名称

bash 字符串比较失败

linux - 从文件添加 iptable 规则

Linux命令行处理CSV

python - 脚本: Match and delete lines with specific pattern

linux - 如何删除特定字符串之前的所有内容

linux - 如何让 awk 命令在 Bash 脚本中工作?

linux - ubuntu bash脚本备份/home/$user但保留最新的

bash 轮分钟到 5