基本区切り記号

基本区切り記号

2つの文字列を1行にまとめて区切り|文字として使用したいと思います。を使用してマージできます。区切り文字として文字列をマージawk '{$1,$2,$3$4$5}'する他の方法はありますか?|

入力する:

XXXXXXXX 0 Xxyxhsag | yuiji

出力:

XXXXXXXX 0 Xxyxhsag|yuiji

答え1

データに区切られたフィールドが含まれており、|区切り|文字の両側にスペースを含めることができるとします。次に、使用する入力フィールド区切り文字awkは式、つまり文字と横のスペースに一致する式です*[|] *|

単一文字を|出力フィールド区切り文字として使用し、awk出力レコードを強制的に再生成すると(フィールドの1つを設定して)、問題が少なくとも質問で要求された方法で解決されます。

awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file

または等しく、

awk -F ' *[|] *' -v OFS='|' '{ $1=$1; print }' file

これをテストしてみてください。

$ cat file
XXXXXXXX 0 Xxyxhsag | yuiji
$ awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
XXXXXXXX 0 Xxyxhsag|yuiji

sed式に似た置換を使用することもできます。

$ sed 's/ *| */|/g' file
XXXXXXXX 0 Xxyxhsag|yuiji

これは、すべての引用符付きフィールドに区切り文字、改行、または引用符が含まれていないテキストまたは「単純な」CSVデータでデータを処理できると仮定します。

答え2

入力データが与えられると、

XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag     |     two
XXXXXXXX 0 Xxyxhsag|third

基本区切り記号

awkデフォルトの区切り文字(1つ以上の連続したスペースまたはタブ)を使用します。

awk '{print $1,$2,$3$4$5}' v
XXXXXXXX 0 Xxyxhsag|one
XXXXXXXX 0 Xxyxhsag|two
XXXXXXXX 0 Xxyxhsag|third

3番目のフィールドの変更を確認してください。

awk '{printf "3th:[%s]\n",$3}' v
3th:[Xxyxhsag]
3th:[Xxyxhsag]
3th:[Xxyxhsag|third]

実際の状況に常に5つのフィールドがある場合、これが解決策になる可能性があります。

パイプ(|) 区切り記号

区切り文字として使用できますが、|これによりフィールドのスペースが保持されます。

awk -F\| '{printf "%s|%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag     |     two
XXXXXXXX 0 Xxyxhsag|third

出力区切り記号を次に変更すると、より明確になる可能性があります。!

awk -F\| '{printf "%s!%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag ! one
XXXXXXXX 0 Xxyxhsag     !     two
XXXXXXXX 0 Xxyxhsag!third

$1これで、末尾のスペースを削除してスペースを先行する必要があるため、多くの利点はありません$2

答え3

あなたはawk試すことができます:

awk -F'|' -v OFS='|' '{sub(/ \| /,"|")} 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
  • FSとOFSを設定しました(同じ値です|
  • そうしてこそ、次のような結果が得られます。
awk -F'|' -v OFS='|' '1' file
XXXXXXXX 0 Xxyxhsag | yuiji
  • |したがって、以下を使用して周囲のスペースを削除しますsub()
{sub(/ \| /,"|")}

関連情報