Shell-Script

向文件中添加行以使它們的長度相等

  • December 5, 2018

我有一堆具有 N 列和不同行數(行)的 .csv 文件。我想添加盡可能多的空行;...;(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

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

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

我需要,

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
;;;;;
;;;;;
;;;;;

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

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
;;;;;
;;;;;

感謝@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

好吧,既不優雅也不高效。實際上,考慮到數據量很小,這需要幾秒鐘的時間,這聽起來很漫長。儘管如此,它仍然有效,

#!/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

引用自:https://unix.stackexchange.com/questions/485857