区切り文字ベースの値で最初のフィールドを印刷する方法

区切り文字ベースの値で最初のフィールドを印刷する方法

ファイル(myfile.txt)には次のデータが含まれています。

abc#ab1=23
nrt#
#clb1aX
amd#322

希望の出力:

abc
nrt
clb1ax
amd

私はこれを行うことができます

for i in `cat myfile.txt` 
do 
  s1=`echo $i | cut -d'#' -f1`; 
  s2=`echo $i | cut -d'#' -f2`; 
  if [ "$s1" == "" ]; then 
    echo "$s2" 
  else
    echo "$s1"
  fi;
done;

forifしかし、1行にawkorまたはsed何かを使用するのと同じように、andを使用せずにこれを行う方法はありますか?cut

答え1

短いawk解決策:

awk -F'#' 'NF{ print ($1 != "" ? $1 : $2) }' file

出力:

abc
nrt
clb1aX
amd

答え2

回答

sed -i "/^#/ { s/#\(.*\)/\1/; b }
        s/#.*//" myfile.txt

;を追加することで1行にリンクできますが、}読みやすくなります。

説明する

sed -iファイルの変更を保持して書き込まないでくださいstdout

/^#/-sedで始まる行にあるとき#

s/#\(.*\)/\1/- 最初の項目を#[everything]に置き換えます[everything]

b- 現在の行のジョブを停止し、次の行のジョブを開始します。
s/#.*//コマンドの実行を防ぎます。)

s/#.*//- 最初の項目を削除します#[everything]
(以前のbコマンドが早く終了しない限り、すべての行に適用されます。)

myfile.txt実行するファイルですsed

答え3

値を持つフィールドがない場合、または2番目の列にしかない場合はどうなりますか?それでは必要になります。

awk -F'#' '{for(i=1; i<=NF; i++) if ($i != "") {print $i; break} }' infile

次の例を見てください。

ABC#asd=123
ノート#
#clsdX
####
###ここ
ACN#123

出力は次のとおりです。

abc
nrt
clsdX
here
acn

またはsed以下を使用してくださいcut

cut -d'#' -f1 <(sed 's/^#\+//; /^$/d' infile )
  • s/^#\+//先行ハッシュ値の削除#(1回以上発生)
  • /^$/d上記以降に生成された空白行(1行がすべてhashesの場合)を削除する#####か、ファイルに空白行がある場合は削除します。
  • ファイルがハッシュで区切られた場合のcut -d'#' -f1最初のフィールドの印刷-f1-d'#'

またはsed単に:

sed 's/^#\+//; /^$/d; s/^\([^#]*\)#.*/\1/' infile
  • これはs/^\([^#]*\)#.*/\1/リクエストラインから始まり、最初のハッシュが表示されるまで一致セットをキャプチャし、結果に印刷し、残りは無視します。

答え4

他のsed

sed 's/^#*\([^#]*\).*/\1/' infile

行を削除するには####を使用してください。

sed 's/^#*\([^#]*\).*/\1/;/^$/d' infile

関連情報