私のソースファイルには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.txt
かsed -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を使用します。cat
mlr
-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