R******d 发帖数: 1436 | 1 一个文件,比如:
a b
c d
e f g
我只想要那些都不是空的列,怎么用bash(包括awk/sed等)方便实现?
比如上面的情况,我就想输出
b
c
f
这一列。
多谢 |
b*******s 发帖数: 5216 | 2 这问题用编程语言解决很简单,不过不清楚shell怎么搞比较简单
也许下班了我试试
【在 R******d 的大作中提到】 : 一个文件,比如: : a b : c d : e f g : 我只想要那些都不是空的列,怎么用bash(包括awk/sed等)方便实现? : 比如上面的情况,我就想输出 : b : c : f : 这一列。
|
R******d 发帖数: 1436 | |
b*******s 发帖数: 5216 | 4 比较惭愧,一直没开始写,上周开车去外地培训了
【在 R******d 的大作中提到】 : 有结果了吗,是不是必须得自己转置先?
|
b*******s 发帖数: 5216 | 5 今天写写看
【在 R******d 的大作中提到】 : 一个文件,比如: : a b : c d : e f g : 我只想要那些都不是空的列,怎么用bash(包括awk/sed等)方便实现? : 比如上面的情况,我就想输出 : b : c : f : 这一列。
|
n******7 发帖数: 12463 | 6 用awk算列数不划算,而且可能出错,如果每一行都有空白列的话,换成grep好点吧...
---
只会用shell基本功能,蛋疼的写了一下,觉得这样搞还不如用perl/python了...
#ncol=`awk '{print NF}' $1 | sort -r | head -1`
ncol=`head -1 $1 | grep -o $'\t' | wc -l`
ncol=$((ncol+1))
nrow=`wc -l $1| cut -f 1 -d ' ' `
good_cols=()
for ((i=1;i<=$ncol;i++))
do
non_blank=`cut -f $i $1 | grep -v '^$' |wc -l | cut -f 1 -d ' '`
if (( $(echo "$non_blank == $nrow" | bc -l) ))
then
good_cols=("${good_cols[@]}" $i)
fi
done
SAVE_IFS=$IFS
IFS=","
cols="${good_cols[*]}"
IFS=$SAVE_IFS
cut -f $cols $1 |
n******7 发帖数: 12463 | 7 发现脑残了,row number 不需要算
要是能利用上paste,也许可以不用再cut一遍
ncol=`head -1 $1 | grep -o $'t' | wc -l`
ncol=$((ncol+1))
good_cols=()
for ((i=1;i<=$ncol;i++))
do
if !(cut -f $i $1 | grep -m 1 '^$' > /dev/null )
then
good_cols=("${good_cols[@]}" $i)
fi
done
SAVE_IFS=$IFS
IFS=","
cols="${good_cols[*]}"
IFS=$SAVE_IFS
cut -f $cols $1 |
R******d 发帖数: 1436 | 8 我捣鼓了一下,awk基本可以实现,加上sed,输出效果就更好一点:
awk -F"\t" '{for(x=1;x<=NF;x++){if($x!=""){sum[x]++;data[NR,x]=$x}}}END{for(
i
=1;i<=NR;i++){for(j=1;j<=NF;j++){if(sum[j]
printf("%s",data[i,j])}else{printf("%st",data[i,j])}};print ""}}' file|sed '
s/\t\{2,\}/\t/g'
【在 n******7 的大作中提到】 : 发现脑残了,row number 不需要算 : 要是能利用上paste,也许可以不用再cut一遍 : ncol=`head -1 $1 | grep -o $'t' | wc -l` : ncol=$((ncol+1)) : good_cols=() : for ((i=1;i<=$ncol;i++)) : do : if !(cut -f $i $1 | grep -m 1 '^$' > /dev/null ) : then : good_cols=("${good_cols[@]}" $i)
|