首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向文件中添加行,使其长度相等。

向文件中添加行,使其长度相等。
EN

Unix & Linux用户
提问于 2018-12-04 09:49:03
回答 3查看 543关注 0票数 5

我有一堆有N列和不同行数(行)的.csv文件。我想添加许多空行;...; (N个分号),使它们具有相同的长度。我可以手动获得最长文件的长度,但是自动完成也会更好。

例如:

我有过,

file1.csv

代码语言:javascript
复制
128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
171; pep; 73; 22:26:10; 3; 72

file2.csv

代码语言:javascript
复制
128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
121; fng; 96; 09:42:10; 3; 52
141; gep; 53; 21:22:10; 3; 62
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892

file3.csv

代码语言:javascript
复制
121; fng; 96; 09:42:10; 3; 52
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892
141; gep; 53; 21:22:10; 3; 62

我需要,

file1.csv

代码语言:javascript
复制
128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
171; pep; 73; 22:26:10; 3; 72
;;;;;
;;;;;
;;;;;

file2.csv

代码语言:javascript
复制
128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
121; fng; 96; 09:42:10; 3; 52
141; gep; 53; 21:22:10; 3; 62
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892

file3.csv

代码语言:javascript
复制
121; fng; 96; 09:42:10; 3; 52
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892
141; gep; 53; 21:22:10; 3; 62
;;;;;
;;;;;
EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2018-12-04 11:54:20

感谢@Sparhawk在评论中的建议,我根据这些更新,

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

emptyLine=;;;;;;;
rr=($(wc -l files*pattern.txt |  awk '{print $1}' | sed '$ d'))
max=$(echo "${rr[*]}" | sort -nr | head -n1)
for name in files*pattern.txt;do
    lineNumber=$(wc -l < $name)
    let missing=max-lineNumber
    for((i=0;i<$missing;i++));do
        echo $emptyLine >> $name
    done
done

嗯,既不优雅,也不高效。事实上,这需要几秒钟的时间,这听起来是永恒的,因为数据很小。尽管如此,它还是有效的,

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

emptyLine=;;;;;;;
rr=($(wc -l files*pattern.txt |  awk '{print $1}' | sed '$ d'))
max=$(echo "${rr[*]}" | sort -nr | head -n1)
for name in $(ls files*pattern.txt);do
    lineNumber=$(cat $name | wc -l )
    let missing=max-lineNumber
    for((i=0;i<$missing;i++));do
        echo $emptyLine >> $name
    done
done

我只是把这个文件放在我有文件的目录中,只要有一个模式可以用files*pattern.txt列出它们。

票数 3
EN

Unix & Linux用户

发布于 2018-12-04 13:53:25

对“我的收音机”的回答的改进。循环中的部分是用awk编写的,应该更快。

代码语言:javascript
复制
max=$(wc -l file*.csv | sed '$ d' | sort -n | tail -n1 | awk '{print $1}' )
for f in file*.csv; do
    awk -F';' -v max=$max \
      'END{
         s=sprintf("%*s",FS,"");
         gsub(/ /,"-",s);
         for(i=NR;i> "$f"
done

使用-F,您可以设置正确的文件字段分隔符(此处为-F';')。

s=sprintf();gsub();部件动态地设置FS (=字段分隔符) (通过)的正确数量。如果您愿意,可以简单地用print ";;;;;"或其他静态内容替换它。

票数 2
EN

Unix & Linux用户

发布于 2018-12-04 15:42:37

为了只计算每个文件中的行数一次:

代码语言:javascript
复制
wc -l *csv |sort -nr| sed 1d | {
    read max file
    pad=$(sed q "$file"|tr -cd ";")  # extract separators from first record
    while read lines file ; do
        while [ $((lines+=1)) -le $max ] ; do
                echo "$pad" >> "$file"
        done
    done
}

注意,文件名中的任何换行符都会给sortwhile read循环带来问题,但是它们可以处理包含正常空格的文件名。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/485857

复制
相关文章

相似问题

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