首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件内容复制到其他位置

将文件内容复制到其他位置
EN

Stack Overflow用户
提问于 2020-09-27 05:51:38
回答 2查看 72关注 0票数 2

我有一个文本文件,其中包含函数的输出结果(路径行,就在结果下面),我只想将下面提到的每个路径行的结果复制到name=中提到的文件中。并希望粘贴到文件的最后一列

我的数据保存在这里的list.txt中

代码语言:javascript
复制
<_io.TextIOWrapper name='/home/liu/datalist/20180603_190202_5.0_38_CD.txt' mode='r' encoding='UTF-8'>
0.9821305886510053
0.9822639336394542
0.9820650754926169
0.9826369946635649
0.983048680372995
<_io.TextIOWrapper name='/home/liu/datalist/20150603_190202_12.0_36_CD.txt' mode='r' encoding='UTF-8'>
0.984263067046808
0.9821305886510053
0.9822639336394542
0.9820650754926169
0.9826369946635649
0.983048680372995
<_io.TextIOWrapper name='/home/liu/datalist/20120603_190202_9.0_35_CD.txt' mode='r' encoding='UTF-8'>
0.984263067046808
0.982871209110385
0.9830143471771022
0.9860952410409616
0.9897257569597108
<_io.TextIOWrapper name='/home/liu/datalist/20100603_190202_125.0_36_CD.txt' mode='r' encoding='UTF-8'>
0.9860794488788789
0.9838808626335948
0.9829656043793615
0.9868238026934462
0.9972756725839034
0.9882482212913676
<_io.TextIOWrapper name='/home/liu/datalist/20240603_190202_265.0_36_CD.txt' mode='r' encoding='UTF-8'>
0.9856758910581078
0.9849158515561436
0.9838016078370099
0.9854127382758501
0.9880763165814402

我尝试了下面的代码:没有正确的想法来做this.Hope一些专家会帮助me.Thanks

代码语言:javascript
复制
#!/bin/sh
for file in `list.txt`
cp cat|list.txt > name

详细说明:假设我们将20180603_190202_5.0_38_CD.txt文件带到主目录,名为file的文件已经存在于/ consideration.This /liu/datalist目录中,它包含如下文件

代码语言:javascript
复制
1 2 3 4 5
5 6 7 8 9
3 4 5 6 7
3 4 5 6 7 
4 5 6 7 8

我希望这个文件如下所示

代码语言:javascript
复制
1 2 3 4 5 0.9821305886510053
5 6 7 8 9 0.9822639336394542
3 4 5 6 7 0.9820650754926169
3 4 5 6 7 0.9826369946635649
4 5 6 7 8 0.983048680372995
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-27 07:52:29

另一种使用关联数组的解决方案:

代码语言:javascript
复制
#!/bin/bash

declare -A filetemp

while read -r line
do
    if [[ $line =~ "name='"(.*?.txt) ]]
    then
        name="${BASH_REMATCH[1]}"
        filetemp[$name]=$(mktemp)
    else
        [ -n "$name" ] && echo "$line" >> "${filetemp[$name]}"
    fi
done < list.txt

for name in "${!filetemp[@]}"
do
    paste -d ' ' "$name" "${filetemp[$name]}" > "${name}.tmp"
    mv -f "${name}.tmp" "$name"
done

编辑:忘记了这一点,但以防万一,在不再需要由mktemp创建的临时文件后,清理它们将是一个好主意:

代码语言:javascript
复制
for name in "${!filetemp[@]}"
do
    tempfile="${filetemp[$name]}"
    paste -d ' ' "$name" "$tempfile" > "${name}.tmp"
    mv -f "${name}.tmp" "$name"
    rm -f "$tempfile"
done

编辑2:正如@lucasgvarela所指出的,当EXIT信号被触发时,trap命令可能是一种更优雅的删除临时文件的方法:

代码语言:javascript
复制
trap 'rm -f "${filetemp[@]}"' EXIT

for name in "${!filetemp[@]}"
do
    paste -d ' ' "$name" "${filetemp[$name]}" > "${name}.tmp"
    mv -f "${name}.tmp" "$name"
done
票数 1
EN

Stack Overflow用户

发布于 2020-09-27 07:36:44

编辑:新代码,修复旧的丑陋代码:D

结果

代码语言:javascript
复制
$ cat 20150603_190202_12.0_36_CD.txt 
1 2 3 4 5
5 6 7 8 9
3 4 5 6 7
3 4 5 6 7
4 5 6 7 8

$ cat 20180603_190202_5.0_38_CD.txt 
1 2 3 4 5
5 6 7 8 9
3 4 5 6 7
3 4 5 6 7
4 5 6 7 8

$ ./test.sh 

$ cat 20150603_190202_12.0_36_CD.txt 
1 2 3 4 5 0.984263067046808
5 6 7 8 9 0.9821305886510053
3 4 5 6 7 0.9822639336394542
3 4 5 6 7 0.9820650754926169
4 5 6 7 8 0.9826369946635649

$ cat 20180603_190202_5.0_38_CD.txt 
1 2 3 4 5 0.9821305886510053
5 6 7 8 9 0.9822639336394542
3 4 5 6 7 0.9820650754926169
3 4 5 6 7 0.9826369946635649
4 5 6 7 8 0.983048680372995

代码

代码语言:javascript
复制
$ cat test.sh 
#!/bin/bash

cat list.txt | cut -d '/' -f5- | sed "s/' mode='r' encoding='UTF-8'>//" > new_list.txt

while read -r line
do
  if [[ "$line" =~ ".txt" ]]; then
    count=0
    filename="$line"
    touch "$filename"
  else
    count=$(($count+1))
    originalline=$(sed -n ${count}p "$filename")
    sed -i "0,/^$originalline\$/s//$originalline $line/" "$filename"
  fi
done < "new_list.txt"

rm new_list.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64082838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档