ファイル(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;
for
if
しかし、1行にawk
orまたは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