[英]Remove entire column with same strings (with header remains) using grep or awk
我有一個文件如下:
name1 name2 name3 name4
AA BB BB CC
AA AA BB CC
AA CC BB CC
AA DD BB DD
AA DD BB AA
第1列和第3列在其內部具有相同的字符串。 如果情況如上所述,我希望刪除整列,但保留標題。 因此最終文件將變成這樣。
name2 name4
BB CC
AA CC
CC CC
DD DD
DD AA
有什么辦法可以使用grep或awk嗎? 非常感謝!
就性能而言,這並不是完全最佳的,但是它確實使用了awk
,並且確實適用於您的示例輸入:
file=$1
header=$(head -1 "$file")
i=1
goodcols=""
for colname in $header; do
count=$(awk "NR>1 {print \$$i}" "$file" | sort -u | wc -l)
if [ $count -gt 1 ]; then
if [ -z "$goodcols" ]; then
goodcols="\$$i"
else
goodcols="$goodcols, \$$i"
fi
fi
i=$((i+1))
done
awk "{print $goodcols}" "$file"
如果您的目的是在第1列和第3列中的任何一行的值都不相同的情況下打印整個文件,並且僅打印第2列和第4列,其中每行在第1列和第3列中具有相同的值,則以下腳本將執行此操作:
same=$(awk 'BEGIN{same=1}NR==1{next}$1!=$3{same=0;exit}{}END{print same}' qq.in)
if [[ $same -eq 1 ]] ; then
awk '{print $2" "$4}' qq.in
else
cat qq.in
fi
如果所有行(當然不是標題)都具有相同的column1/3
值,則第一個awk
輸出1
。 否則輸出0
。
然后,您只需使用它要么過濾列,要么按原樣輸出文件。
如果相反,僅在第1列中的所有值都相同且第3列中的所有值都相同(根據測試數據)時才要剝離第1列和第3列,請將第一行更改為:
allsame=$(awk 'BEGIN{allsame=1}NR==1{next}NR==2{val1=$1;val3=$3;next}$1!=val1||$3!=val3{allsame=0;exit}{}END{print allsame}' qq.in)
UNIX Shell只是從中調用UNIX工具的環境。 用於常規文本操作的UNIX工具是awk,因此只需使用它即可:
$ cat tst.awk
{
for (col=1; col<=NF; col++) {
val[NR,col] = $col
if ( (NR>1) && (!seen[col,$col]++) ) {
cnt[col]++
}
}
}
END {
for (row=1; row<=NR; row++) {
ofs = ""
for (col=1; col<=NF; col++) {
if (cnt[col] != 1) {
printf "%s%s", ofs, val[row,col]
ofs = OFS
}
}
print ""
}
}
$ awk -f tst.awk file
name2 name4
BB CC
AA CC
CC CC
DD DD
DD AA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.