首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件处理自动化的bash

将文件处理自动化的bash
EN

Stack Overflow用户
提问于 2013-02-21 05:43:45
回答 1查看 266关注 0票数 0

我需要将一个大的已排序文件拆分为较小的块,每个文件包含一个已排序的人名列表。现在我想保证同名的人不会出现在两个文件中,例如,

代码语言:javascript
复制
File1:
.
.
James
James
Kobe

File2:
Kobe
Nash
Nash
.
.

我要做的是

代码语言:javascript
复制
File1:
.
.
James
James
Kobe
Kobe

File2:
Nash
Nash
.
.

在此之前,我使用sed手动完成此操作。现在我想写一个bash脚本来自动化这个过程,但是不熟悉bash..有什么帮助吗?怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-21 07:06:20

您需要将“当前”文件的最后一行与“下一步”文件的第一行进行比较。我假设您的文件名为"File1,File2,... FileN“。这是未经测试的。

代码语言:javascript
复制
n=1
while true; do
    current=File$n
    next=File$((++n)) 
    if [[ ! -f $next ]]; then
        break
    fi
    last=$(tail -1 "$current")
    first=$(head -1 "$next")
    while [[ $last == $first ]]; do
        echo "$last" >> "$current"    # append the name to the end of the current
        sed -i 1d "$next"             # remove the first line of the next file
        first=$(head -1 "$next")
    done
done

这可能有点慢,因为您可能会重复地从下一个文件中删除一行。这可能会更快一些:同样,未经测试。

代码语言:javascript
复制
n=1
while true; do
    current=File$n
    next=File$((++n)) 
    if [[ ! -f $next ]]; then
        break
    fi
    last=$(tail -1 "$current")
    first=$(head -1 "$next")
    num=$(awk -v line="$last" -v N=0 '$0 == line {N++; next} {print N; exit}' "$next")
    if (( num > 0 )); then
        for (( i=1; i<=num; i++ )); do
            echo "$last" >> "$current"
        done
        sed -i "1,$Nd" "$next"
    fi
done
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14990520

复制
相关文章

相似问题

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