如何在sed,awk或bash中使用循环/变量将1组文件的内容添加到另一组文件中?

时间:2017-03-17 09:16:49

标签: bash awk sed

我想弄清楚如何添加由

定义的files1集的内容
ls /home/dir1/*-split.csv.*

然后将files1中每个文件的内容添加到另一组文件中,例如

定义的files2
ls /home/dir2/*.py.*.py

files1files2这两套文件中的文件总数相同。

我已经设法使用

为1个文件工作
files1=($home/dir1/'*'-split.csv.'*')
grep -h '^[^\s]*' $files1 | xargs -I '{}' sed -i  s'/userid/{}/' /home/dir2/*.py.*.py

但我不知道如何将其转换为循环,以便将files1中的文件插入files2中的文件中。

如上所述,sed语句会将位于'userid'的{​​{1}}中的files2替换为位于/home/dir2/*.py.*.py的{​​{1}}中文件的内容}。

files1中的所有文件都包含/home/dir1/*-split.csv.*,这是每次都使用files2中的文件内容替换的字符串。

有没有人有任何想法?谢谢!

<小时/> 的修改

大家好,感谢您的评论并推动我做出更好的解释!

希望这会让事情变得更加清晰......像这样的文件列表......

'userid'

每个文件都包含一行文字,例如

files1

在files2中,我有4个文件的相应列表,例如

ls /home/dir1/*-split.csv.*
just-users-split.csv.aa
just-users-split.csv.ab
just-users-split.csv.ac
just-users-split.csv.ad

所有cat *.aa "userPhD","userdegree","user123", cat *.ab "userxyz","userabc","user456" 文件都是彼此的副本,并包含ls /home/dir2/*.py.*.py twud.py.1.py twud.py.2.py twud.py.3.py twud.py.4.py python脚本。

然后我要插入

的内容

*.py.*.py加入91 line

just-users-split.csv.aa加入twud.py.1.py

just-users-split.csv.ab加入twud.py.2.py

just-users-split.csv.ac加入twud.py.3.py

插入可以在* .py文件的顶部或底部完成,或者在理想的世界中,just-users-split.csv.ad的内容将插入第33行以替换当前字符串{{1} }

最后,在这个例子中有4个文件要循环,但在其他情况下,可能有5,10或20对文件要循环。

这是否更有意义?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

#!/bin/bash

files1=($(ls /home/dir1/*-split.csv.*))
files2=($(ls /home/dir2/*.py.*.py))

for (( i = 0; i < ${#files1[@]}; i++ )); do
  content=($(sed -n 1p ${files1[$i]}))     
  sed -i "33s/.*/ids = $content/" ${files2[$i]} 
done

for循环中的变量i[0,n)范围内,n是files1 / files2数组的大小。

在for循环的每一轮中,变量content被分配到dir1中文件的第一行。然后,此变量用于替换dir2内的加工文件内容的第33行。

例如:

$ cat -n /home/dir1/just-users-split.csv.ab | sed -n '1p'
     1  "userPhD","userdegree","user123"
$ cat -n /home/dir2/twud.py.1.py | sed -n '33p'
    33  ids = "userid"
$ ./script
$ cat -n /home/dir2/twud.py.1.py | sed -n '33p'
    33  ids = "userPhD","userdegree","user123"