Sed コマンドが不要な新しい行を生成します。

Sed コマンドが不要な新しい行を生成します。

私のソースファイルには6行しかありませんが、sedコマンドを使用してテキスト修飾子を適用すると、各入力行に2行が生成されます。

ソースファイル:

September 2022||2022|||13564|7JM9LF    |DANIEL, PAPERMAN
September 2022||2022|||48917|7CX04Q    |BROWN, RADY
September 2022||2022|||177456|75YBGL    |LAYYNE, MAXWELL
September 2022||2022|||5326|774YMX    |BROWN, WHITE

ターゲットファイル: ここに画像の説明を入力してください。

使用されたコマンド:

sed 's/\([^|]*\)/\"&\"/g' ./src_mod.txt > tgt.txt

答え1

|定義されたすべてのフィールドの周りに引用符を追加しようとしているようです。追加の改行を取得する理由は、Windowsスタイルの行末があるためである可能性が高いです。

ただ実行するdos2unix src_mod.txtsed -i 's/\r//' src_mod.txt

元の方法も機能しますが、必要なものを取得できる他の方法は次のとおりです。

$ sed -E 's/([^|]*)(\||$)/"\1"\2/g' file
"September 2022"|""|"2022"|""|""|"13564"|"7JM9LF    "|"DANIEL, PAPERMAN"
"September 2022"|""|"2022"|""|""|"48917"|"7CX04Q    "|"BROWN, RADY"
"September 2022"|""|"2022"|""|""|"177456"|"75YBGL    "|"LAYYNE, MAXWELL"
"September 2022"|""|"2022"|""|""|"5326"|"774YMX    "|"BROWN, WHITE"

または、次のものが利用できない場合-E

sed  's/\([^|]*\)\(|\|$\)/"\1"\2/g' file

またはパール:

$ perl -F'\|' -lane 'print join("|", map{ qq/"$_"/} @F)' file
"September 2022"|""|"2022"|""|""|"13564"|"7JM9LF    "|"DANIEL, PAPERMAN"
"September 2022"|""|"2022"|""|""|"48917"|"7CX04Q    "|"BROWN, RADY"
"September 2022"|""|"2022"|""|""|"177456"|"75YBGL    "|"LAYYNE, MAXWELL"
"September 2022"|""|"2022"|""|""|"5326"|"774YMX    "|"BROWN, WHITE"

またはパール:

$ perl -F'\|' -lane 'print "\"",join("\"|\"", @F), "\""' file
"September 2022"|""|"2022"|""|""|"13564"|"7JM9LF    "|"DANIEL, PAPERMAN"
"September 2022"|""|"2022"|""|""|"48917"|"7CX04Q    "|"BROWN, RADY"
"September 2022"|""|"2022"|""|""|"177456"|"75YBGL    "|"LAYYNE, MAXWELL"
"September 2022"|""|"2022"|""|""|"5326"|"774YMX    "|"BROWN, WHITE"

答え2

問題は、入力ファイルがUnixテキストファイルではないことです。 DOSテキストファイルにすることができます。

CSV認識ツールは入力がDOSテキストファイルであることを無視するため、デフォルトでフィールドを正しく参照できます。

以下は、csvformatパイプで区切られたすべてのフィールドを参照するために使用されます。この演習の入力はDOSテキストファイルに変換されました。

$ csvformat -d '|' -D '|' -U1 file
"September 2022"|""|"2022"|""|""|"13564"|"7JM9LF    "|"DANIEL, PAPERMAN"
"September 2022"|""|"2022"|""|""|"48917"|"7CX04Q    "|"BROWN, RADY"
"September 2022"|""|"2022"|""|""|"177456"|"75YBGL    "|"LAYYNE, MAXWELL"
"September 2022"|""|"2022"|""|""|"5326"|"774YMX    "|"BROWN, WHITE"

csvformat(部分csvkit)デフォルトでは、実際に引用する必要があるフィールドのみが引用されます。これは、フィールド区切り文字をデフォルトのコンマに変更すると、各レコードの最後のフィールドを引用する必要があるためです。

$ csvformat -d '|' file
September 2022,,2022,,,13564,7JM9LF    ,"DANIEL, PAPERMAN"
September 2022,,2022,,,48917,7CX04Q    ,"BROWN, RADY"
September 2022,,2022,,,177456,75YBGL    ,"LAYYNE, MAXWELL"
September 2022,,2022,,,5326,774YMX    ,"BROWN, WHITE"

ミラーCSVをサポートする別のツールは次のとおりです。

$ mlr --csv --fs pipe -N --quote-all cat file
"September 2022"|""|"2022"|""|""|"13564"|"7JM9LF    "|"DANIEL, PAPERMAN"
"September 2022"|""|"2022"|""|""|"48917"|"7CX04Q    "|"BROWN, RADY"
"September 2022"|""|"2022"|""|""|"177456"|"75YBGL    "|"LAYYNE, MAXWELL"
"September 2022"|""|"2022"|""|""|"5326"|"774YMX    "|"BROWN, WHITE"

また、このツールは基本的に必要なものだけを引用するように設定されています。

$ mlr --csv --ifs pipe -N cat file
September 2022,,2022,,,13564,7JM9LF    ,"DANIEL, PAPERMAN"
September 2022,,2022,,,48917,7CX04Q    ,"BROWN, RADY"
September 2022,,2022,,,177456,75YBGL    ,"LAYYNE, MAXWELL"
September 2022,,2022,,,5326,774YMX    ,"BROWN, WHITE"

clean-whitespaceフィールドからサイドスペースを削除するか、入力に実際にタイトルがある場合は、コマンドにnotを使用します。catmlr-N

答え3

sedそうしないと、ユーザーが指示しない限り改行文字は追加されません。

ここでは、入力ファイルにMS-DOS CRLF行末がある可能性が高いため、Unixの観点から(行はLFで区切られている)行がCR文字で終わるように見えるため、出力で次の行が表示されます|"CR"。スクリーンショットを撮ったアプリケーションがCRを行区切り文字としてレンダリングする理由もあります。

ここでは、これらのファイルをUnix形式に変換したいと思います。dos2unixこれを行うツールですが、存在しない場合は、両方をperl使用して末尾のCR文字を削除し、各フィールドの周りに引用符を追加できます。

perl -lpe 's/\r$//; $_ = join "|", map qq("$_"), split /\|/, $_, -1' <src_mod.txt >tgt.txt

空行は空のフィールドを含むのではなく、ゼロフィールドのリストとして扱われます。

削除することもできますみんな行末文字だけでなくCR文字trも次のように置き換えますsed

<src_mod.txt tr -d '\r' | sed 's/[^|]*/"&"/g' >tgt.txt

"置換時にエスケープがあってはならず、一致するフルテキストが呼び出されるため、キャプチャグループを使用する必要はありません(キャプチャグループの一致を\(...\)呼び出すために使用する)。&\1

関連情報