我有一堆有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; 72file2.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; 892file3.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; 892file3.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
;;;;;
;;;;;发布于 2018-12-04 11:54:20
感谢@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列出它们。
发布于 2018-12-04 13:53:25
对“我的收音机”的回答的改进。循环中的部分是用awk编写的,应该更快。
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 ";;;;;"或其他静态内容替换它。
发布于 2018-12-04 15:42:37
为了只计算每个文件中的行数一次:
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
}注意,文件名中的任何换行符都会给sort和while read循环带来问题,但是它们可以处理包含正常空格的文件名。
https://unix.stackexchange.com/questions/485857
复制相似问题