簡體   English   中英

使用grep或awk刪除具有相同字符串的整個列(保留標題)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM