向文件添加行以使其长度相等

myr*_*dio 5 awk shell-script text-processing csv files

我有一堆 .csv 文件,其中包含 N 列和不同数量的行(行)。我想添加尽可能多的空行;...;(N 个分号)以使它们的长度相同。我可以手动获取最长文件的长度,但自动完成此操作也很好。

例如:

我有,

file1.csv

128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
171; pep; 73; 22:26:10; 3; 72
Run Code Online (Sandbox Code Playgroud)

file2.csv

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
Run Code Online (Sandbox Code Playgroud)

file3.csv

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
Run Code Online (Sandbox Code Playgroud)

我需要,

file1.csv

128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
171; pep; 73; 22:26:10; 3; 72
;;;;;
;;;;;
;;;;;
Run Code Online (Sandbox Code Playgroud)

file2.csv

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
Run Code Online (Sandbox Code Playgroud)

file3.csv

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
;;;;;
;;;;;
Run Code Online (Sandbox Code Playgroud)

myr*_*dio 3

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

  • @Sparhawk:我认为你的意思是`wc -l &lt;​​ $name` (2认同)